1 Purpose

This document is a preliminary proof of concept and initial exploratory data analysis (Tukey 1977). Goals of the document are to:

  • illustrate the kinds of analysis possible with the tabulation of ICE inspection data
  • provide preliminary exploratory plot of select variables from the Significant Incident Summary Sheets.
  • generate some preliminary summary information

The data are presently incomplete and represent results compiled as of 2021-07-06.

# Load necessary libraries

# Reading and wrangling
library(googlesheets4)
library(readr)
library(tidyverse)
library(janitor)
library(lubridate)
library(DT)

# Plotting
library(ggplot2)
library(RColorBrewer)

# Tables
library(kableExtra)

# Load custom function
source("function_clean_facility_names.R", local = knitr::knit_global())

2 Introduction

2.1 Method for Reading G-324A-19-inc form

The code for this report is specific to data logged in the G-324A-19 form and the incident summaries portion of that form. The incident summary portion of this form is probably the most complex data structure in the project and also contains the largest volume of quantitative information. Therefore, it seemed like a good place to start with an initial proof of concept.

At the outset, there were issues reading in the Google Sheet. Several of the numeric columns read into R as lists which was undesirable. In the Google Sheet, Craig set the columns to plain text rather than auto and the data are read into R as character columns. This seemed to resolve the issue for a time, and it was possible to use the type_convert() function from the readr library (Wickham and Hester 2020) to convert these columns to numbers. The col_types argument of the read_sheet function of the googlesheets4 library (Bryan 2021) was used to explicitly set the column types to character. After applying the clean_facility_names custom function, additional transformations like converting facility to a factor are applied.

There were some issues using lubridate (Spinu, Grolemund, and Wickham 2021) to wrangle the month and year fields to a proper date. Craig was not able to discern the cause of the issue. However, changing the month format on the incident sheet from abbreviated to fully written out months solved the issue. Those changes were made in the master Google Sheet and the data were called using the googlesheets4 library.

# Read in Sheet G-324A-19
df_324 <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19",
                 col_names = TRUE,
                 col_types = "c") %>% 
  clean_names() %>% 
  
  # Run custom cleaning function
  clean_facility_names() %>% 
  
  # df specific changes
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = mdy(inspection_date),
         current_inspection_date_from = mdy(current_inspection_date_from),
         current_inspection_date_to = mdy(current_inspection_date_to)
         ) %>% 
  relocate(date, .before = inspection_date) %>% 
  mutate_at(c(20:49), as.numeric)
# Read Google Sheet incident worksheet, convert to data frame, and wrangle
df_324_inc <- read_sheet("https://docs.google.com/spreadsheets/d/1im5VSi3bIEi13O8WQ56wEIXSyNEstbGMylXXgD9bAG0/edit#gid=1858227071",
                 sheet="G-324A-19-inc",
                 col_types = "c") %>% 
  clean_names() %>%
  
  # Run custom cleaning function
  clean_facility_names() %>% 


  # df_specific changes
  unite(date, year:month) %>% 
  mutate(facility = as.factor(facility),
         state = as.factor(state),
         date = ym(date)
         ) %>% 
  mutate_at(c(6:76), as.numeric)

At present 199 SIS and inspection cover letter combinations out of approximately 300 inspections are complete. The completed inspections range in time from 2019-08-22 to 2021-05-27. Students are now working on older SIS forms which are structured differently. The preliminary EDA below is restricted to the more current SIS forms which were first used in May 2019.

2.2 Summary Tables

Summary tables help to provide an overview of how many instances occur within particular category of data or how frequent a particular issue is recorded at a given facility. Summary tables are generated using a combination of group_by with summarize with the results piped to kable and kableExtra. This produces results similar to a “pivot table” from Excel.

Table 2.1 shows the number of inspections per facility that are processed so far. The values range from 1-3 inspections. Dorchester County Detention Center, Golden State Annex, and River Correctional Center all have three inspections.

df_facility <- df_324 %>% 
  group_by(facility) %>% 
  summarise(n_inspections = n()) %>% 
  ungroup() 
  
df_facility %>% 
  kable(caption = "Inspections Reviewed by Facility",
        col.names = c("Facility", "Inspections Reviewed")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 2.1: Inspections Reviewed by Facility
Facility Inspections Reviewed
Adams County Correctional Center 2
Adelanto ICE Processing Center - East 2
Adelanto ICE Processing Center - West 2
Alamance County Detention Center 1
Alamance County Jail 1
Allen Parish Public Safety Complex 2
Aurora ICE Processing Center 2
Aurora ICE Processing Center II - Annex 2
Baker County Detention Center 2
Bergen County Jail 2
Bluebonnet Detention Center 1
Boone County Jail 2
Bossier Parish Corrections Center 1
Bristol County Jail and House of Correction 2
Brooks County Detention Center 1
Broward Transitional Center 2
Butler County Jail 1
Calhoun County Correctional Center 2
Cambria County Prison 1
Caroline Detention Facility 2
Carver County Jail 1
Cass County Jail 1
Catahoula Correctional Center 2
CCA Florence Correctional Center 1
Chase County Detention Center 1
Chippewa County Correctional Facility 1
Christian County Jail 1
Cibola County Correctional Center 2
Clay County Jail 2
Clinton County Correctional Facility 2
Coastal Bend Detention Center 1
David L. Moss Criminal Justice Center 2
Desert View Annex 2
Dodge County Detention Facility 2
Donald W. Wyatt Detention Facility 2
Dorchester County Detention Center 3
Douglas County Department of Corrections 1
East Hidalgo Detention Center 1
Eden Detention Center 1
El Paso Service Processing Center 2
El Valle Detention Facility 1
Elizabeth Contract Detention Facility 2
Eloy Detention Center 2
Essex County Correctional Facility 2
Etowah County Jail 1
Florence Service Processing Center 2
Folkston ICE Processing Center 1
Folkston ICE Processing Center Annex 1
Freeborn County Adult Detention Center 2
Geauga County Jail 2
Glades County Detention Center 1
Golden State Annex 3
Hall County Department of Corrections 1
Hardin County Jail 2
Henderson Detention Center 1
Houston Contract Detention Facility 2
Howard County Detention Center 1
Hudson County Corrections and Rehabilitation Center 2
Immigration Centers of America - Farmville 1
Imperial Regional Detention Facility 2
Irwin County Detention Center 1
Jackson Parish Correctional Center 2
Jena LaSalle Detention Facility 1
Jerome Combs Detention Center 2
Joe Corley Processing Center 2
Johnson County Corrections Center 1
Kay County Detention Center 2
Krome North Service Processing Center 1
Krome Service Processing Center 2
La Palma Correctional Center 1
Laredo Processing Center 2
LaSalle Correctional Center 1
LaSalle County Regional Detention Center 1
LaSalle ICE Processing Center 1
Limestone County Detention Center 2
McHenry County Adult Correctional Facility 1
Mesa Verde ICE Processing Facility 1
Monroe County Inmate Dormitory 1
Montgomery County Jail 1
Montgomery Processing Center 2
Morgan County Adult Detention Center 1
Morrow County Correctional Facility 1
Northern Oregon Correctional Facility 1
Northwest ICE Processing Center 2
Nye County Detention Center 2
Okmulgee County Jail - Moore Detention Facility 1
Orange County Correctional Facility 2
Otay Mesa Detention Center 2
Otero County Processing Center 2
Pike County Correctional Facility 2
Pine Prairie ICE Processing Center 2
Platte County Detention Center 1
Plymouth County Correctional Facility 1
Polk County Adult Detention Center 2
Port Isabel Service Processing Center 2
Prairieland Detention Center 2
Pulaski County Detention Center 2
Richwood Correctional Center 2
Rio Grande Detention Center 2
River Correctional Center 3
Robert A. Deyton Detention Facility 2
Rolling Plains Detention Center 1
Saint Clair County Jail 1
San Luis Regional Detention Center 2
Seneca County Jail 2
Shawnee County Department of Corrections - Adult Detention Center 1
Sherburne County Jail 2
Sheriff Al Cannon Detention Center 1
South Louisiana ICE Processing Center 2
South Texas ICE Processing Center 1
Stewart Detention Center 2
Strafford County Department of Corrections 2
T. Don Hutto Residential Center 1
Teller County Jail 2
Torrance County Detention Facility 1
Val Verde Correctional Facility 1
Wakulla County Detention Facility 2
Washoe County Detention Center 1
Webb County Detention Center 2
West Texas Detention Facility 1
Western Tennessee Detention Facility 1
Willacy County Regional Detention Facility 2
Winn Correctional Center 2
Worcester County Jail 1
York County Prison 2
Yuba County Jail 2

2.3 Facet Plots

Facet plots partition each portion of a plot into a matrix of panels. These plots are produced for several categories of data where each panel represents a facility for a given variable reported in the SIS form. Within each category, columns are pivoted longer and plotted by date. Graphing is done using the ggplot2 library (Wickham et al. 2021) with the facet_wrap function to provide a means to compare multiple facilities simultaneously. Such a plot can help identify trends and guide more specific questions.

2.4 SIS Form structure

The ICE G-324A Significant Incident Summary contains information on the following categories of information:

3 Sexual Abuse and Assault

3.1 Allegations

3.1.1 Summary Tables

df_sex_alleg <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_allegations_type",
               values_to = "sexual_abuse_allegations_count") %>%
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sexual_abuse_allegations_type = factor(sexual_abuse_allegations_type, levels = c(
    "sexual_abuse_allegations_detainee_on_detainee",
    "sexual_abuse_allegations_inmate_on_detainee",
    "sexual_abuse_allegations_detainee_on_inmate",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg %>% 
  group_by(sexual_abuse_allegations_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations by Type` = sum(sexual_abuse_allegations_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Type",
        col.names = c("Allegation Type", "Total Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 3.1: Total Sexual Abuse and Assault Allegations by Type
Allegation Type Total Allegation Type
sexual_abuse_allegations_detainee_on_detainee 495
sexual_abuse_allegations_inmate_on_detainee 32
sexual_abuse_allegations_detainee_on_inmate 15
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer 189
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_29 17
total_sexual_abuse_allegations 744
df_sex_alleg %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_allegations = sum(sexual_abuse_allegations_count)) %>% 
  arrange(desc(total_sexual_abuse_allegations)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 3.1: Total Sexual Abuse and Assault Allegations by Facility
Facility Total Allegations by Facility
Otay Mesa Detention Center 160
Eloy Detention Center 122
Adelanto ICE Processing Center - West 102
Krome Service Processing Center 70
El Paso Service Processing Center 66
York County Prison 58
Montgomery Processing Center 44
South Texas ICE Processing Center 44
Northwest ICE Processing Center 36
Western Tennessee Detention Facility 36
Imperial Regional Detention Facility 32
Essex County Correctional Facility 24
Irwin County Detention Center 24
Adelanto ICE Processing Center - East 22
Bluebonnet Detention Center 22
Dodge County Detention Facility 22
Jackson Parish Correctional Center 22
LaSalle ICE Processing Center 22
Otero County Processing Center 22
Webb County Detention Center 22
Folkston ICE Processing Center 20
Caroline Detention Facility 18
Clinton County Correctional Facility 18
Yuba County Jail 18
Aurora ICE Processing Center 16
Aurora ICE Processing Center II - Annex 16
Calhoun County Correctional Center 16
CCA Florence Correctional Center 16
Hardin County Jail 16
Port Isabel Service Processing Center 16
Glades County Detention Center 14
Jena LaSalle Detention Facility 14
Okmulgee County Jail - Moore Detention Facility 14
Stewart Detention Center 14
Bergen County Jail 12
Eden Detention Center 12
Houston Contract Detention Facility 12
La Palma Correctional Center 12
Mesa Verde ICE Processing Facility 12
Prairieland Detention Center 12
Winn Correctional Center 12
Broward Transitional Center 8
Geauga County Jail 8
Joe Corley Processing Center 8
Limestone County Detention Center 8
Nye County Detention Center 8
Pine Prairie ICE Processing Center 8
Rio Grande Detention Center 8
River Correctional Center 8
Sherburne County Jail 8
Strafford County Department of Corrections 8
Baker County Detention Center 6
Florence Service Processing Center 6
Northern Oregon Correctional Facility 6
Torrance County Detention Facility 6
Adams County Correctional Center 4
Bristol County Jail and House of Correction 4
David L. Moss Criminal Justice Center 4
El Valle Detention Facility 4
Folkston ICE Processing Center Annex 4
Hall County Department of Corrections 4
Henderson Detention Center 4
Hudson County Corrections and Rehabilitation Center 4
Laredo Processing Center 4
McHenry County Adult Correctional Facility 4
Morgan County Adult Detention Center 4
Plymouth County Correctional Facility 4
Seneca County Jail 4
Val Verde Correctional Facility 4
Wakulla County Detention Facility 4
Bossier Parish Corrections Center 2
Cass County Jail 2
Chippewa County Correctional Facility 2
Cibola County Correctional Center 2
Clay County Jail 2
Dorchester County Detention Center 2
Elizabeth Contract Detention Facility 2
Freeborn County Adult Detention Center 2
Immigration Centers of America - Farmville 2
Kay County Detention Center 2
Krome North Service Processing Center 2
Monroe County Inmate Dormitory 2
Montgomery County Jail 2
Orange County Correctional Facility 2
Pike County Correctional Facility 2
Pulaski County Detention Center 2
Richwood Correctional Center 2
Rolling Plains Detention Center 2
Shawnee County Department of Corrections - Adult Detention Center 2
Sheriff Al Cannon Detention Center 2
South Louisiana ICE Processing Center 2
West Texas Detention Facility 2
Worcester County Jail 2
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Boone County Jail 0
Brooks County Detention Center 0
Butler County Jail 0
Cambria County Prison 0
Carver County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Coastal Bend Detention Center 0
Desert View Annex 0
Donald W. Wyatt Detention Facility 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Golden State Annex 0
Howard County Detention Center 0
Jerome Combs Detention Center 0
Johnson County Corrections Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Polk County Adult Detention Center 0
Robert A. Deyton Detention Facility 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Washoe County Detention Center 0
Willacy County Regional Detention Facility 0

3.1.2 Facet Plot of Sexual Abuse and Assault Allegations by Facility

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg %>% 
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_allegations_count, linetype=sexual_abuse_allegations_type))+
  geom_line(aes(color = sexual_abuse_allegations_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

    # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

3.2 Substantiated Allegations

3.2.1 Summary Tables

df_sex_alleg_sub <- df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sexual_abuse_allegations = sum(c_across(
       sexual_abuse_allegations_detainee_on_detainee_2:
       sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sexual_abuse_allegations_detainee_on_detainee_2:total_sexual_abuse_allegations,
               names_to = "sexual_abuse_substantiated_type",
               values_to = "sexual_abuse_substantiated_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sexual_abuse_substantiated_type= factor(sexual_abuse_substantiated_type, levels =c(
    "sexual_abuse_allegations_detainee_on_detainee_2",
    "sexual_abuse_allegations_inmate_on_detainee_2",
    "sexual_abuse_allegations_detainee_on_inmate_2",
    "sexual_abuse_allegations_staff_contractor_volunteer_on_detainee",
    "sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34",
    "total_sexual_abuse_allegations"
  )))
df_sex_alleg_sub %>% 
  group_by(sexual_abuse_substantiated_type) %>% 
  summarise(`Sexual Abuse and Assault Allegations Substantiated by Type` = sum(sexual_abuse_substantiated_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Type",
        col.names = c("Substantiated Allegation Type", "Total Substantiated Allegation Type")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 3.2: Total Substantiated Sexual Abuse and Assault Allegations by Type
Substantiated Allegation Type Total Substantiated Allegation Type
sexual_abuse_allegations_detainee_on_detainee_2 82
sexual_abuse_allegations_inmate_on_detainee_2 10
sexual_abuse_allegations_detainee_on_inmate_2 3
sexual_abuse_allegations_staff_contractor_volunteer_on_detainee 6
sexual_abuse_allegations_detainee_on_staff_contractor_volunteer_34 1
total_sexual_abuse_allegations 102
df_sex_alleg_sub %>% 
  group_by(facility) %>% 
  summarise(total_sexual_abuse_substantiated = sum(sexual_abuse_substantiated_count)) %>% 
  arrange(desc(total_sexual_abuse_substantiated)) %>% 
  ungroup() %>% 
  kable(caption = "Total Substantiated Sexual Abuse and Assault Allegations by Facility",
        col.names = c("Facility", "Total Substantiated Allegations by Facility")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 3.2: Total Substantiated Sexual Abuse and Assault Allegations by Facility
Facility Total Substantiated Allegations by Facility
Otay Mesa Detention Center 40
Eloy Detention Center 34
Krome Service Processing Center 26
York County Prison 18
Geauga County Jail 8
Folkston ICE Processing Center 6
Irwin County Detention Center 6
Webb County Detention Center 6
CCA Florence Correctional Center 4
Clay County Jail 4
Morgan County Adult Detention Center 4
Otero County Processing Center 4
Stewart Detention Center 4
Yuba County Jail 4
Baker County Detention Center 2
Bergen County Jail 2
Bluebonnet Detention Center 2
Chippewa County Correctional Facility 2
Dodge County Detention Facility 2
El Paso Service Processing Center 2
El Valle Detention Facility 2
Essex County Correctional Facility 2
Hardin County Jail 2
Joe Corley Processing Center 2
La Palma Correctional Center 2
LaSalle ICE Processing Center 2
Mesa Verde ICE Processing Facility 2
Monroe County Inmate Dormitory 2
Northern Oregon Correctional Facility 2
Okmulgee County Jail - Moore Detention Facility 2
Torrance County Detention Facility 2
Winn Correctional Center 2
Adams County Correctional Center 0
Adelanto ICE Processing Center - East 0
Adelanto ICE Processing Center - West 0
Alamance County Detention Center 0
Allen Parish Public Safety Complex 0
Aurora ICE Processing Center 0
Aurora ICE Processing Center II - Annex 0
Boone County Jail 0
Bossier Parish Corrections Center 0
Bristol County Jail and House of Correction 0
Brooks County Detention Center 0
Broward Transitional Center 0
Butler County Jail 0
Calhoun County Correctional Center 0
Cambria County Prison 0
Caroline Detention Facility 0
Carver County Jail 0
Cass County Jail 0
Catahoula Correctional Center 0
Christian County Jail 0
Cibola County Correctional Center 0
Clinton County Correctional Facility 0
Coastal Bend Detention Center 0
David L. Moss Criminal Justice Center 0
Desert View Annex 0
Donald W. Wyatt Detention Facility 0
Dorchester County Detention Center 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Elizabeth Contract Detention Facility 0
Florence Service Processing Center 0
Folkston ICE Processing Center Annex 0
Freeborn County Adult Detention Center 0
Glades County Detention Center 0
Golden State Annex 0
Hall County Department of Corrections 0
Henderson Detention Center 0
Houston Contract Detention Facility 0
Howard County Detention Center 0
Hudson County Corrections and Rehabilitation Center 0
Immigration Centers of America - Farmville 0
Imperial Regional Detention Facility 0
Jackson Parish Correctional Center 0
Jena LaSalle Detention Facility 0
Jerome Combs Detention Center 0
Johnson County Corrections Center 0
Kay County Detention Center 0
Krome North Service Processing Center 0
Laredo Processing Center 0
LaSalle Correctional Center 0
LaSalle County Regional Detention Center 0
Limestone County Detention Center 0
McHenry County Adult Correctional Facility 0
Montgomery County Jail 0
Montgomery Processing Center 0
Morrow County Correctional Facility 0
Northwest ICE Processing Center 0
Nye County Detention Center 0
Orange County Correctional Facility 0
Pike County Correctional Facility 0
Pine Prairie ICE Processing Center 0
Platte County Detention Center 0
Plymouth County Correctional Facility 0
Polk County Adult Detention Center 0
Port Isabel Service Processing Center 0
Prairieland Detention Center 0
Pulaski County Detention Center 0
Richwood Correctional Center 0
Rio Grande Detention Center 0
River Correctional Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
San Luis Regional Detention Center 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sherburne County Jail 0
Sheriff Al Cannon Detention Center 0
South Louisiana ICE Processing Center 0
South Texas ICE Processing Center 0
Strafford County Department of Corrections 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Val Verde Correctional Facility 0
Wakulla County Detention Facility 0
Washoe County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0

3.2.2 Facet Plot of Substantiated Sexual Abuse and Assault Allegations

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(6, "Paired")
plot_colors[6] <- "#000000"

# Create the labels
plot_labels <- c(
    "Sexual Abuse Allegations - Detainee on Detainee",
    "Sexual Abuse Allegations - Inmate on Detainee",
    "Sexual Abuse Allegations - Detainee on Inmate",
    "Sexual Abuse Allegations - Staff/Contractor/Volunteer on Detainee",
    "Number of Sexual Abuse Allegations - Detainee on Staff/Contractor/Volunteer",
    "Total Sexual Abuse Allegations")

df_sex_alleg_sub %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sexual_abuse_substantiated_count, linetype=sexual_abuse_substantiated_type))+
  geom_line(aes(color = sexual_abuse_substantiated_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sexual Abuse Allegation Type:",
    guide = guide_legend(nrow = 6)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Sexual Abuse Allegation Type:")+

  labs(title = "Sexual Abuse Allegations Substantiated")+
  ylab("Number of Allegations")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =8))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4 Medical

4.1 Medical Observation

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Detainees in Medical Observation",
    "Detainees in Mental Health Observation",
    "Total Individuals in Medical or Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_mental_medical_observation = sum(c_across(
       detainees_in_medical_observation:
       detainees_in_mental_health_observation
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  detainees_in_medical_observation:total_mental_medical_observation,
               names_to = "medical_mental_observation_type",
               values_to = "medical_mental_observation_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(medical_mental_observation_type = factor(medical_mental_observation_type, levels = c(
    "detainees_in_medical_observation",
    "detainees_in_mental_health_observation",
    "total_mental_medical_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = medical_mental_observation_count, linetype=medical_mental_observation_type))+
  geom_line(aes(color = medical_mental_observation_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Observation Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
                     labels = plot_labels,
                     name = "Observation Type:",)+

  labs(title = "Medical and Mental Health Observation")+
  ylab("Number of Individuals in Observation")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4.2 Infections Disease

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
    "Infectious Disease Reported",
    "Infectious Disease Confirmed")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       infectious_disease_reported:
       infections_disease_confirmed
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # # Create a new total column
  # # In this case not used
  # mutate(total_infections_disease_report_confirmed = sum(c_across(
  #      infectious_disease_reported:
  #      infections_disease_confirmed
  # ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  infectious_disease_reported:infections_disease_confirmed,
               names_to = "infectious_disease_type",
               values_to = "infectious_disease_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(infectious_disease_type = factor(infectious_disease_type, levels = c(
    "infectious_disease_reported",
    "infections_disease_confirmed"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = infectious_disease_count, linetype=infectious_disease_type))+
  geom_line(aes(color = infectious_disease_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Category:",
    guide = guide_legend(nrow = 2)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Category:")+

  labs(title = "Infectious Diseases Reported and Confirmed")+
  ylab("Count")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4.3 Medical and Mental Health Referrals

# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(5, "Paired")
plot_colors[5] <- "#000000"

# Create plot labels
plot_labels <- c(
    "Outside Medical Referrals",
    "Detainees Transported to Off-Site Hospitals for Emergency Reasons",
    "Admissions to Off-Site Hospitals for Medical Reasons",
    "Admissions to Off-Site Hospitals for Mental Health Reasons",
    "Total Referrals")


df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_referrals = sum(c_across(
       outside_medical_referrals:
       admissions_to_off_site_hospitals_for_mental_health_reasons
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  outside_medical_referrals:total_referrals,
               names_to = "referral_type",
               values_to = "referral_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(referral_type= factor(referral_type, levels = c(
    "outside_medical_referrals",
    "detainees_transported_to_off_site_hospitals_for_emergency_care",
    "admissions_to_off_site_hospitals_for_medical_reasons",
    "admissions_to_off_site_hospitals_for_mental_health_reasons",
    "total_referrals"
  ))) %>% 
  
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = referral_count, linetype=referral_type))+
  geom_line(aes(color = referral_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Referral Type:",
    guide = guide_legend(nrow = 5)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Referral Type:")+

  labs(title = "Medical and Mental Health Referrals")+
  ylab("Number of Referrals")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4.4 Sick Call Requests and Encounters

df_sick_call <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         sick_call_requests,
         sick_call_encounters) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_sick_call = sick_call_requests,
         sick_call_encounters) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= sick_call_requests:
         sick_call_encounters,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_call"
  )))
df_sick_call %>% 
  group_by(sick_call_type) %>% 
  summarise(`Total Sick Call by Type` = sum(sick_call_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 4.1: Total Sick Call by Type
Type Total
sick_call_requests 648941
sick_call_encounters 639104
df_sick_call %>% 
  group_by(facility) %>% 
  summarise(total_sick_call = sum(sick_call_count)) %>% 
  arrange(desc(total_sick_call)) %>% 
  ungroup() %>% 
  kable(caption = "Total Sick Call Requests/Encounters by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 4.1: Total Sick Call Requests/Encounters by Facility
Facility Total
Adelanto ICE Processing Center - East 66777
Adelanto ICE Processing Center - West 66777
Port Isabel Service Processing Center 59808
South Texas ICE Processing Center 48814
Rio Grande Detention Center 48309
Montgomery Processing Center 44111
Otay Mesa Detention Center 42973
Eloy Detention Center 39798
Prairieland Detention Center 36952
Otero County Processing Center 30388
Imperial Regional Detention Facility 30196
Broward Transitional Center 30028
River Correctional Center 29224
Polk County Adult Detention Center 29048
El Paso Service Processing Center 28326
Henderson Detention Center 27056
Stewart Detention Center 26994
Jackson Parish Correctional Center 26363
Houston Contract Detention Facility 23860
Irwin County Detention Center 23626
Aurora ICE Processing Center 23178
Aurora ICE Processing Center II - Annex 23178
Krome Service Processing Center 23057
Essex County Correctional Facility 21902
Webb County Detention Center 21685
El Valle Detention Facility 19821
Winn Correctional Center 19786
Joe Corley Processing Center 16756
LaSalle ICE Processing Center 16400
La Palma Correctional Center 16032
Adams County Correctional Center 16025
Immigration Centers of America - Farmville 15811
Calhoun County Correctional Center 15122
York County Prison 14910
Jena LaSalle Detention Facility 14429
Florence Service Processing Center 14358
Bossier Parish Corrections Center 12884
Orange County Correctional Facility 12745
Elizabeth Contract Detention Facility 11870
Catahoula Correctional Center 11612
Laredo Processing Center 11282
Sherburne County Jail 11064
Mesa Verde ICE Processing Facility 10336
Folkston ICE Processing Center 9572
McHenry County Adult Correctional Facility 9245
Pine Prairie ICE Processing Center 9024
Torrance County Detention Facility 7766
Caroline Detention Facility 7762
South Louisiana ICE Processing Center 7608
Bluebonnet Detention Center 6309
Donald W. Wyatt Detention Facility 5965
Hudson County Corrections and Rehabilitation Center 5771
Baker County Detention Center 4575
Pulaski County Detention Center 4533
Richwood Correctional Center 4210
Folkston ICE Processing Center Annex 3778
Johnson County Corrections Center 3628
Okmulgee County Jail - Moore Detention Facility 3524
Pike County Correctional Facility 3480
Yuba County Jail 3432
Geauga County Jail 3299
Wakulla County Detention Facility 3161
Allen Parish Public Safety Complex 3052
CCA Florence Correctional Center 2830
T. Don Hutto Residential Center 2682
Clinton County Correctional Facility 2416
Clay County Jail 2351
Limestone County Detention Center 2334
Bristol County Jail and House of Correction 2266
David L. Moss Criminal Justice Center 2174
Bergen County Jail 2162
Kay County Detention Center 2026
Krome North Service Processing Center 1955
Carver County Jail 1940
Hardin County Jail 1688
Northwest ICE Processing Center 1616
Golden State Annex 1181
Butler County Jail 1174
Jerome Combs Detention Center 1086
Worcester County Jail 1060
Freeborn County Adult Detention Center 959
Nye County Detention Center 913
Morgan County Adult Detention Center 876
Boone County Jail 828
Cambria County Prison 742
Dodge County Detention Facility 709
Montgomery County Jail 658
Val Verde Correctional Facility 649
LaSalle Correctional Center 546
Howard County Detention Center 526
Strafford County Department of Corrections 507
Rolling Plains Detention Center 456
Northern Oregon Correctional Facility 414
Chippewa County Correctional Facility 385
Alamance County Detention Center 360
West Texas Detention Facility 334
Saint Clair County Jail 320
Coastal Bend Detention Center 296
Cibola County Correctional Center 259
Teller County Jail 220
Morrow County Correctional Facility 184
Platte County Detention Center 156
Shawnee County Department of Corrections - Adult Detention Center 132
Seneca County Jail 105
Desert View Annex 65
LaSalle County Regional Detention Center 62
Christian County Jail 24
Brooks County Detention Center 21
San Luis Regional Detention Center 19
Washoe County Detention Center 14
Dorchester County Detention Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Robert A. Deyton Detention Facility 0
Sheriff Al Cannon Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Generating a linetype vector for use in the plot
plot_lines <- c(
    "solid",
    "solid",
    "dotted"
    )

# Use Color Brewer to set colors
plot_colors <- brewer.pal(3, "Paired")
plot_colors[3] <- "#000000"

# Create labels
plot_labels <- c(
    "Sick Call Requests",
    "Sick Call Encounters",
    "Total Sick Calls")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       sick_call_requests:
       sick_call_encounters
       ) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create a new total column
  mutate(total_sick_calls = sum(c_across(
       sick_call_requests:
       sick_call_encounters
  ))) %>% 

  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  sick_call_requests:total_sick_calls,
               names_to = "sick_call_type",
               values_to = "sick_call_count") %>%
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(sick_call_type = factor(sick_call_type, levels = c(
    "sick_call_requests",
    "sick_call_encounters",
    "total_sick_calls"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = sick_call_count, linetype=sick_call_type))+
  geom_line(aes(color = sick_call_type),size=.65) +
  
  # Set the linetype
  scale_linetype_manual(
    values = plot_lines,
    labels = plot_labels,
    name = "Sick Call Type:",
    guide = guide_legend(nrow = 3)
    )+
  
  # Set the color
  scale_color_manual(values = plot_colors,
    labels = plot_labels,
    name = "Sick Call Type:")+

  labs(title = "Sick Calls")+
  ylab("Number of Sick Calls")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 8),
    legend.position = "bottom"
    )+

  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =3))+
  
  # Wrap
  facet_wrap(~ facility, ncol=3)

4.5 Suicide Attempts and Watches

The following shows Suicide Attempts and Suicide Watches based on the status of the data as of 2021-07-06. The numbers are subject to change.

df_suicide <- df_324_inc %>%
  
  # Select a subset of columns to work with
  select(id,
         facility,
         date,
         suicide_attempts_or_self_harm,
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Need the rowwise function to compute a row-at-a-time
  # in the following mutate function
  rowwise(id) %>% 
  
  # Create new total column
  mutate(total_suicide = suicide_attempts_or_self_harm +
         suicide_watches_constant_watch_mental_health_observation) %>% 
  
  # Tidy
  pivot_longer(.,
               cols= suicide_attempts_or_self_harm:
               total_suicide,
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA
  drop_na() %>% 
  
  # Explicitly set factor levels
  mutate(segregation_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation",
    "total_suicide"
  )))
df_suicide %>% 
  group_by(suicide_type) %>% 
  summarise(`Total Suicide Attempt or Watch by Type` = sum(suicide_count)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Type",
        col.names = c("Type", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive"))
Table 4.2: Total Suicide Attempt or Watch by Type
Type Total
suicide_attempts_or_self_harm 244
suicide_watches_constant_watch_mental_health_observation 5122
total_suicide 5364
df_suicide %>% 
  group_by(facility) %>% 
  summarise(total_suicide = sum(suicide_count)) %>% 
  arrange(desc(total_suicide)) %>% 
  ungroup() %>% 
  kable(caption = "Total Suicide Attempt or Watch by Facility",
        col.names = c("Facility", "Total")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 4.2: Total Suicide Attempt or Watch by Facility
Facility Total
Adelanto ICE Processing Center - East 878
Adelanto ICE Processing Center - West 878
Henderson Detention Center 750
Aurora ICE Processing Center 606
Aurora ICE Processing Center II - Annex 606
Bergen County Jail 468
La Palma Correctional Center 402
Bristol County Jail and House of Correction 390
Port Isabel Service Processing Center 358
Otay Mesa Detention Center 282
Stewart Detention Center 272
Eloy Detention Center 246
York County Prison 214
Otero County Processing Center 192
Montgomery Processing Center 182
Irwin County Detention Center 178
Prairieland Detention Center 158
South Texas ICE Processing Center 158
Essex County Correctional Facility 156
Caroline Detention Facility 144
Pike County Correctional Facility 144
Imperial Regional Detention Facility 134
Folkston ICE Processing Center 122
River Correctional Center 122
Polk County Adult Detention Center 114
Nye County Detention Center 106
Florence Service Processing Center 104
Glades County Detention Center 102
LaSalle ICE Processing Center 102
Winn Correctional Center 92
El Valle Detention Facility 86
Immigration Centers of America - Farmville 86
El Paso Service Processing Center 84
Krome Service Processing Center 74
Sherburne County Jail 74
Houston Contract Detention Facility 68
Jena LaSalle Detention Facility 68
Broward Transitional Center 64
Joe Corley Processing Center 64
Adams County Correctional Center 62
Northwest ICE Processing Center 58
Baker County Detention Center 56
Limestone County Detention Center 56
Carver County Jail 54
Hudson County Corrections and Rehabilitation Center 54
Mesa Verde ICE Processing Facility 52
Elizabeth Contract Detention Facility 50
Pulaski County Detention Center 50
Pine Prairie ICE Processing Center 48
Webb County Detention Center 48
Jackson Parish Correctional Center 46
Plymouth County Correctional Facility 42
Rio Grande Detention Center 40
Calhoun County Correctional Center 38
CCA Florence Correctional Center 36
McHenry County Adult Correctional Facility 32
Strafford County Department of Corrections 32
David L. Moss Criminal Justice Center 30
South Louisiana ICE Processing Center 30
Donald W. Wyatt Detention Facility 24
Folkston ICE Processing Center Annex 24
Yuba County Jail 24
Butler County Jail 22
Orange County Correctional Facility 22
Torrance County Detention Facility 22
Worcester County Jail 22
Johnson County Corrections Center 20
Shawnee County Department of Corrections - Adult Detention Center 20
Bluebonnet Detention Center 18
Boone County Jail 18
Allen Parish Public Safety Complex 16
Catahoula Correctional Center 16
Clinton County Correctional Facility 16
Kay County Detention Center 14
Alamance County Detention Center 12
Val Verde Correctional Facility 12
Wakulla County Detention Facility 12
Bossier Parish Corrections Center 10
Dodge County Detention Facility 10
Howard County Detention Center 10
Okmulgee County Jail - Moore Detention Facility 10
Seneca County Jail 10
Clay County Jail 8
Geauga County Jail 8
Krome North Service Processing Center 8
Laredo Processing Center 8
Richwood Correctional Center 8
Robert A. Deyton Detention Facility 8
San Luis Regional Detention Center 8
Coastal Bend Detention Center 6
Golden State Annex 6
Sheriff Al Cannon Detention Center 6
Freeborn County Adult Detention Center 4
Hardin County Jail 4
LaSalle Correctional Center 4
Morgan County Adult Detention Center 4
Cambria County Prison 2
Chippewa County Correctional Facility 2
Desert View Annex 2
Hall County Department of Corrections 2
Jerome Combs Detention Center 2
Northern Oregon Correctional Facility 2
West Texas Detention Facility 2
Brooks County Detention Center 0
Cass County Jail 0
Christian County Jail 0
Cibola County Correctional Center 0
Dorchester County Detention Center 0
East Hidalgo Detention Center 0
Eden Detention Center 0
LaSalle County Regional Detention Center 0
Monroe County Inmate Dormitory 0
Montgomery County Jail 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
T. Don Hutto Residential Center 0
Teller County Jail 0
Washoe County Detention Center 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

# Create plot labels
plot_labels <- c(
      "Suicide Attempts or Self Harm",
      "Suicide Watches/Constant Watch/Mental Health Observation")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation
       ) %>% 
  drop_na() %>% 
 
  # Call a range of table columns and pivot long
  pivot_longer(.,
               cols=  c(suicide_attempts_or_self_harm,
       suicide_watches_constant_watch_mental_health_observation),
               names_to = "suicide_type",
               values_to = "suicide_count") %>% 
  
  # Remove NA values
  drop_na() %>% 
  
  # Explicitly define factor levels
  mutate(suicide_type = factor(suicide_type, levels = c(
    "suicide_attempts_or_self_harm",
    "suicide_watches_constant_watch_mental_health_observation"
  ))) %>% 
  
  # Calling the plot and formatting
  ggplot(aes(x=date, y = suicide_count))+
  geom_line(aes(color=suicide_type), size = .65) +
  
  # Set the color
  scale_color_manual(
    values = plot_colors,
    labels = plot_labels,
    name = "Type:"
    )+
  
  labs(title = "Suicide Attempts and Watches")+
  ylab("Number of Attempts or Watches")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

4.6 Hunger Strikes

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date, hunger_strikes) %>% 

  group_by(facility) %>% 
  summarise(total_hunger_strike = sum(hunger_strikes)) %>% 
  arrange(desc(total_hunger_strike)) %>% 
  ungroup() %>% 
  kable(caption = "Total Hunger Strikes by Facility",
        col.names = c("Facility", "Total Hunger Strikes")) %>% 
  kable_styling(c("hover", "striped", "condensed", "responsive")) %>% 
  scroll_box(height = "300px")
Table 4.3: Total Hunger Strikes by Facility
Facility Total Hunger Strikes
Bossier Parish Corrections Center 136
Krome Service Processing Center 71
La Palma Correctional Center 62
LaSalle ICE Processing Center 53
Otero County Processing Center 51
Jena LaSalle Detention Facility 49
Otay Mesa Detention Center 48
El Paso Service Processing Center 46
Port Isabel Service Processing Center 35
Adelanto ICE Processing Center - East 28
Adelanto ICE Processing Center - West 28
Montgomery Processing Center 18
Prairieland Detention Center 17
Bergen County Jail 15
Irwin County Detention Center 14
Okmulgee County Jail - Moore Detention Facility 14
Johnson County Corrections Center 13
Imperial Regional Detention Facility 11
South Texas ICE Processing Center 11
Florence Service Processing Center 8
Teller County Jail 8
Butler County Jail 7
Houston Contract Detention Facility 7
Immigration Centers of America - Farmville 6
Elizabeth Contract Detention Facility 5
Folkston ICE Processing Center 5
Plymouth County Correctional Facility 5
Sherburne County Jail 5
Torrance County Detention Facility 5
David L. Moss Criminal Justice Center 4
Joe Corley Processing Center 4
Henderson Detention Center 3
York County Prison 3
Calhoun County Correctional Center 2
Caroline Detention Facility 2
Golden State Annex 2
McHenry County Adult Correctional Facility 2
Nye County Detention Center 2
Polk County Adult Detention Center 2
Wakulla County Detention Facility 2
Broward Transitional Center 1
Cambria County Prison 1
Catahoula Correctional Center 1
CCA Florence Correctional Center 1
Clinton County Correctional Facility 1
Desert View Annex 1
El Valle Detention Facility 1
Hudson County Corrections and Rehabilitation Center 1
Northern Oregon Correctional Facility 1
Pulaski County Detention Center 1
Alamance County Detention Center 0
Boone County Jail 0
Brooks County Detention Center 0
Carver County Jail 0
Cass County Jail 0
Chippewa County Correctional Facility 0
Christian County Jail 0
Clay County Jail 0
Coastal Bend Detention Center 0
Donald W. Wyatt Detention Facility 0
Douglas County Department of Corrections 0
East Hidalgo Detention Center 0
Eden Detention Center 0
Essex County Correctional Facility 0
Folkston ICE Processing Center Annex 0
Glades County Detention Center 0
Hall County Department of Corrections 0
Hardin County Jail 0
Laredo Processing Center 0
Limestone County Detention Center 0
Mesa Verde ICE Processing Facility 0
Montgomery County Jail 0
Morgan County Adult Detention Center 0
Morrow County Correctional Facility 0
Platte County Detention Center 0
Rio Grande Detention Center 0
Robert A. Deyton Detention Facility 0
Rolling Plains Detention Center 0
Saint Clair County Jail 0
Seneca County Jail 0
Shawnee County Department of Corrections - Adult Detention Center 0
Sheriff Al Cannon Detention Center 0
Strafford County Department of Corrections 0
T. Don Hutto Residential Center 0
Val Verde Correctional Facility 0
Washoe County Detention Center 0
Webb County Detention Center 0
West Texas Detention Facility 0
Western Tennessee Detention Facility 0
Willacy County Regional Detention Facility 0
Worcester County Jail 0
Adams County Correctional Center NA
Alamance County Jail NA
Allen Parish Public Safety Complex NA
Aurora ICE Processing Center NA
Aurora ICE Processing Center II - Annex NA
Baker County Detention Center NA
Bluebonnet Detention Center NA
Bristol County Jail and House of Correction NA
Chase County Detention Center NA
Cibola County Correctional Center NA
Dodge County Detention Facility NA
Dorchester County Detention Center NA
Eloy Detention Center NA
Etowah County Jail NA
Freeborn County Adult Detention Center NA
Geauga County Jail NA
Howard County Detention Center NA
Jackson Parish Correctional Center NA
Jerome Combs Detention Center NA
Kay County Detention Center NA
Krome North Service Processing Center NA
LaSalle Correctional Center NA
LaSalle County Regional Detention Center NA
Monroe County Inmate Dormitory NA
Northwest ICE Processing Center NA
Orange County Correctional Facility NA
Pike County Correctional Facility NA
Pine Prairie ICE Processing Center NA
Richwood Correctional Center NA
River Correctional Center NA
San Luis Regional Detention Center NA
South Louisiana ICE Processing Center NA
Stewart Detention Center NA
Winn Correctional Center NA
Yuba County Jail NA
NA NA
# Use Color Brewer to set colors and modify
# the last color to be black for totals.
plot_colors <- brewer.pal(2, "Paired")

df_324_inc %>%
  
  # Subset the df to only the used cols
  select(id, facility, date,
       hunger_strikes
       ) %>% 
  drop_na() %>% 
 

  # Calling the plot and formatting
  ggplot(aes(x=date, y = hunger_strikes))+
  geom_line(size = .65) +
  
  # scale_color_manual(
  #   values = plot_colors,
  #   labels = c(
  #     "Suicide Attempts or Self Harm",
  #     "Suicide Watches/Constant Watch/Mental Health Observation"
  #     ),
  #   name = "Type:"
  #   )+
  # 
  labs(title = "Hunger Strikes")+
  ylab("Number of Hunger Strikes")+
  xlab("Date")+
  theme(
    strip.text = element_text(size = 5),
    legend.position = "bottom"
    )+
  
  # Set the legend to multiple rows
  guides(col = guide_legend(nrow =5))+
  
  # Wrap
  facet_wrap(~ facility, ncol = 3)

5 Cause of Death

5.1 Suicide as Cause of Death

Bar plot of ICE and non-ICE deaths by suicide plotted by facility as of 2021-07-06.

df_324 %>% 
  select(id,
         facility,
         state,
         date,
         fac_operator,
         cod_suicide_ice,
         cod_suicide_not_ice) %>% 
  drop_na() %>% 
  filter(cod_suicide_ice>0|cod_suicide_not_ice >0) %>% 
  mutate(cod_suicide_total = cod_suicide_ice + cod_suicide_not_ice) %>% 
  
  # Here one could call datatable() or kable()
  # to get a list of the facilities and count
  
  # Initiate the plot
  ggplot(aes(x=cod_suicide_total, y=facility))+
  geom_boxplot()+
  scale_x_continuous(breaks = c(1,2))+
  labs(title = "Cause of Death Suicide",
       subtitle = "Includes ICE and non-ICE Deaths by Suicide")+
  xlab("COD Suicide Total")+
  ylab("Facility")

6 Observations

Observations made on the data as they accumulate are logged below.

6.1 28 May 2021

  1. Adelanto ICE Processing Center - East and West have identical data for 2020, but the numbers are different for 2019 with East being much lower than west. Craig checked the inspections and the numbers are different for East and West in 2019 while they are in fact the same for 2020. Note that 2020 is a remote inspection. However, it is significant that the two are comparable in one instance and not comparable in another case.

  2. Almance County Jail and Chase County Detention Center both seem to register blank for solitary. Craig suspects this is because there were not cases of solitary reported.

6.2 27 May 2021

One of the important early observations has to do with the naming of facilities. ICE is often inconsistent with facility naming and the names do often change over time. Both the changing of names and inconsistent naming conventions can cause confusion as well as error when tabulating results.

  1. The graphs for “Adelanto ICE Processing Center - East” and “Adelanto ICE Processing Center - West” are identical. This is consistent with information Craig recalls seeing in one of the inspections, that the numbers for the facilities are “merged” or combined.

    • For facet graphing consider filtering. For analysis purposes may need to treat the two facilities as “merged”
  2. Adelanto ICE Processing Center West” should be combined with “Adelanto ICE Processing Center - West.” It appears that ICE is not consistently naming the facilities, in one case the name lacks a dash character which causes them to be graphed separately.

    • The dash was added to Adelanto West.
  3. It would be good to check if there really two facilities in Almance County. There are entries listed for “Almance County Detention Center” and “Almance County Jail.”

    • Need to verify that these are in fact distinct facilities.
  4. Aurora ICE Processing Center II - Annex” and “Aurora II Annex” should probably be combined. Need to check the inspections to verify.

    • Aurora II Annex (CO) - Jan. 29, 2021" was changed to”Aurora ICE Processing Center II - Annex (CO) - Jan. 29, 2021"

7 References

Bryan, Jennifer. 2021. Googlesheets4: Access Google Sheets Using the Sheets API V4. https://github.com/tidyverse/googlesheets4.
Spinu, Vitalie, Garrett Grolemund, and Hadley Wickham. 2021. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.
Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2021. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Wickham, Hadley, and Jim Hester. 2020. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.
LS0tDQp0aXRsZTogIlByZWxpbWluYXJ5IFJlYWRpbmcgYW5kIEdyYXBoaW5nIG9mIEluc3BlY3Rpb24gRGF0YSINCmF1dGhvcjogIk5hdGhhbiBDcmFpZyINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVBICVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQpiaWJsaW9ncmFwaHk6IFtjaXRhdGlvbnMuYmliLCBwYWNrYWdlcy5iaWJdDQotLS0NCg0KIyBQdXJwb3NlDQoNClRoaXMgZG9jdW1lbnQgaXMgYSBwcmVsaW1pbmFyeSBwcm9vZiBvZiBjb25jZXB0IGFuZCBpbml0aWFsIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgW0B0dWtleTE5NzddLiBHb2FscyBvZiB0aGUgZG9jdW1lbnQgYXJlIHRvOg0KDQotICAgaWxsdXN0cmF0ZSB0aGUga2luZHMgb2YgYW5hbHlzaXMgcG9zc2libGUgd2l0aCB0aGUgdGFidWxhdGlvbiBvZiBJQ0UgaW5zcGVjdGlvbiBkYXRhDQotICAgcHJvdmlkZSBwcmVsaW1pbmFyeSBleHBsb3JhdG9yeSBwbG90IG9mIHNlbGVjdCB2YXJpYWJsZXMgZnJvbSB0aGUgU2lnbmlmaWNhbnQgSW5jaWRlbnQgU3VtbWFyeSBTaGVldHMuDQotICAgZ2VuZXJhdGUgc29tZSBwcmVsaW1pbmFyeSBzdW1tYXJ5IGluZm9ybWF0aW9uDQoNClRoZSBkYXRhIGFyZSBwcmVzZW50bHkgaW5jb21wbGV0ZSBhbmQgcmVwcmVzZW50IHJlc3VsdHMgY29tcGlsZWQgYXMgb2YgYHIgU3lzLkRhdGUoKWAuDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KCWVjaG8gPSBUUlVFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCgl3YXJuaW5nID0gRkFMU0UNCikNCmBgYA0KDQpgYGB7ciBsb2FkLWxpYnJhcmllc30NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQoNCiMgUmVhZGluZyBhbmQgd3JhbmdsaW5nDQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoRFQpDQoNCiMgUGxvdHRpbmcNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KDQojIFRhYmxlcw0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIExvYWQgY3VzdG9tIGZ1bmN0aW9uDQpzb3VyY2UoImZ1bmN0aW9uX2NsZWFuX2ZhY2lsaXR5X25hbWVzLlIiLCBsb2NhbCA9IGtuaXRyOjprbml0X2dsb2JhbCgpKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNCiMjIE1ldGhvZCBmb3IgUmVhZGluZyBHLTMyNEEtMTktaW5jIGZvcm0NCg0KVGhlIGNvZGUgZm9yIHRoaXMgcmVwb3J0IGlzIHNwZWNpZmljIHRvIGRhdGEgbG9nZ2VkIGluIHRoZSBHLTMyNEEtMTkgZm9ybSBhbmQgdGhlIGluY2lkZW50IHN1bW1hcmllcyBwb3J0aW9uIG9mIHRoYXQgZm9ybS4gVGhlIGluY2lkZW50IHN1bW1hcnkgcG9ydGlvbiBvZiB0aGlzIGZvcm0gaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tcGxleCBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgcHJvamVjdCBhbmQgYWxzbyBjb250YWlucyB0aGUgbGFyZ2VzdCB2b2x1bWUgb2YgcXVhbnRpdGF0aXZlIGluZm9ybWF0aW9uLiBUaGVyZWZvcmUsIGl0IHNlZW1lZCBsaWtlIGEgZ29vZCBwbGFjZSB0byBzdGFydCB3aXRoIGFuIGluaXRpYWwgcHJvb2Ygb2YgY29uY2VwdC4NCg0KQXQgdGhlIG91dHNldCwgdGhlcmUgd2VyZSBpc3N1ZXMgcmVhZGluZyBpbiB0aGUgR29vZ2xlIFNoZWV0LiBTZXZlcmFsIG9mIHRoZSBudW1lcmljIGNvbHVtbnMgcmVhZCBpbnRvIFIgYXMgbGlzdHMgd2hpY2ggd2FzIHVuZGVzaXJhYmxlLiBJbiB0aGUgR29vZ2xlIFNoZWV0LCBDcmFpZyBzZXQgdGhlIGNvbHVtbnMgdG8gYHBsYWluIHRleHRgIHJhdGhlciB0aGFuIGBhdXRvYCBhbmQgdGhlIGRhdGEgYXJlIHJlYWQgaW50byBSIGFzIGNoYXJhY3RlciBjb2x1bW5zLiBUaGlzIHNlZW1lZCB0byByZXNvbHZlIHRoZSBpc3N1ZSBmb3IgYSB0aW1lLCBhbmQgaXQgd2FzIHBvc3NpYmxlIHRvIHVzZSB0aGUgYHR5cGVfY29udmVydCgpYCBmdW5jdGlvbiBmcm9tIHRoZSBgcmVhZHJgIGxpYnJhcnkgW0BSLXJlYWRyXSB0byBjb252ZXJ0IHRoZXNlIGNvbHVtbnMgdG8gbnVtYmVycy4gVGhlIGBjb2xfdHlwZXNgIGFyZ3VtZW50IG9mIHRoZSBgcmVhZF9zaGVldGAgZnVuY3Rpb24gb2YgdGhlIGBnb29nbGVzaGVldHM0YCBsaWJyYXJ5IFtAUi1nb29nbGVzaGVldHM0XSB3YXMgdXNlZCB0byBleHBsaWNpdGx5IHNldCB0aGUgY29sdW1uIHR5cGVzIHRvIGNoYXJhY3Rlci4gQWZ0ZXIgYXBwbHlpbmcgdGhlIGBjbGVhbl9mYWNpbGl0eV9uYW1lc2AgY3VzdG9tIGZ1bmN0aW9uLCBhZGRpdGlvbmFsIHRyYW5zZm9ybWF0aW9ucyBsaWtlIGNvbnZlcnRpbmcgZmFjaWxpdHkgdG8gYSBmYWN0b3IgYXJlIGFwcGxpZWQuDQoNClRoZXJlIHdlcmUgc29tZSBpc3N1ZXMgdXNpbmcgYGx1YnJpZGF0ZWAgW0BSLWx1YnJpZGF0ZV0gdG8gd3JhbmdsZSB0aGUgbW9udGggYW5kIHllYXIgZmllbGRzIHRvIGEgcHJvcGVyIGRhdGUuIENyYWlnIHdhcyBub3QgYWJsZSB0byBkaXNjZXJuIHRoZSBjYXVzZSBvZiB0aGUgaXNzdWUuIEhvd2V2ZXIsIGNoYW5naW5nIHRoZSBtb250aCBmb3JtYXQgb24gdGhlIGluY2lkZW50IHNoZWV0IGZyb20gYWJicmV2aWF0ZWQgdG8gZnVsbHkgd3JpdHRlbiBvdXQgbW9udGhzIHNvbHZlZCB0aGUgaXNzdWUuIFRob3NlIGNoYW5nZXMgd2VyZSBtYWRlIGluIHRoZSBtYXN0ZXIgR29vZ2xlIFNoZWV0IGFuZCB0aGUgZGF0YSB3ZXJlIGNhbGxlZCB1c2luZyB0aGUgYGdvb2dsZXNoZWV0czRgIGxpYnJhcnkuDQoNCmBgYHtyIHJlYWQtZGF0YS0zMjR9DQojIFJlYWQgaW4gU2hlZXQgRy0zMjRBLTE5DQpkZl8zMjQgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWltNVZTaTNiSUVpMTNPOFdRNTZ3RUlYU3lORXN0YkdNeWxYWGdEOWJBRzAvZWRpdCNnaWQ9MTg1ODIyNzA3MSIsDQogICAgICAgICAgICAgICAgIHNoZWV0PSJHLTMyNEEtMTkiLA0KICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSAiYyIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIA0KICAjIFJ1biBjdXN0b20gY2xlYW5pbmcgZnVuY3Rpb24NCiAgY2xlYW5fZmFjaWxpdHlfbmFtZXMoKSAlPiUgDQogIA0KICAjIGRmIHNwZWNpZmljIGNoYW5nZXMNCiAgbXV0YXRlKGZhY2lsaXR5ID0gYXMuZmFjdG9yKGZhY2lsaXR5KSwNCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwNCiAgICAgICAgIGRhdGUgPSBtZHkoaW5zcGVjdGlvbl9kYXRlKSwNCiAgICAgICAgIGN1cnJlbnRfaW5zcGVjdGlvbl9kYXRlX2Zyb20gPSBtZHkoY3VycmVudF9pbnNwZWN0aW9uX2RhdGVfZnJvbSksDQogICAgICAgICBjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90byA9IG1keShjdXJyZW50X2luc3BlY3Rpb25fZGF0ZV90bykNCiAgICAgICAgICkgJT4lIA0KICByZWxvY2F0ZShkYXRlLCAuYmVmb3JlID0gaW5zcGVjdGlvbl9kYXRlKSAlPiUgDQogIG11dGF0ZV9hdChjKDIwOjQ5KSwgYXMubnVtZXJpYykNCmBgYA0KDQpgYGB7ciByZWFkLWRhdGEtMzI0LWluY2lkZW50fQ0KIyBSZWFkIEdvb2dsZSBTaGVldCBpbmNpZGVudCB3b3Jrc2hlZXQsIGNvbnZlcnQgdG8gZGF0YSBmcmFtZSwgYW5kIHdyYW5nbGUNCmRmXzMyNF9pbmMgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWltNVZTaTNiSUVpMTNPOFdRNTZ3RUlYU3lORXN0YkdNeWxYWGdEOWJBRzAvZWRpdCNnaWQ9MTg1ODIyNzA3MSIsDQogICAgICAgICAgICAgICAgIHNoZWV0PSJHLTMyNEEtMTktaW5jIiwNCiAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gImMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lDQogIA0KICAjIFJ1biBjdXN0b20gY2xlYW5pbmcgZnVuY3Rpb24NCiAgY2xlYW5fZmFjaWxpdHlfbmFtZXMoKSAlPiUgDQoNCg0KICAjIGRmX3NwZWNpZmljIGNoYW5nZXMNCiAgdW5pdGUoZGF0ZSwgeWVhcjptb250aCkgJT4lIA0KICBtdXRhdGUoZmFjaWxpdHkgPSBhcy5mYWN0b3IoZmFjaWxpdHkpLA0KICAgICAgICAgc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpLA0KICAgICAgICAgZGF0ZSA9IHltKGRhdGUpDQogICAgICAgICApICU+JSANCiAgbXV0YXRlX2F0KGMoNjo3NiksIGFzLm51bWVyaWMpDQpgYGANCg0KQXQgcHJlc2VudCBgciBucm93KGRmXzMyNClgIFNJUyBhbmQgaW5zcGVjdGlvbiBjb3ZlciBsZXR0ZXIgY29tYmluYXRpb25zIG91dCBvZiBhcHByb3hpbWF0ZWx5IDMwMCBpbnNwZWN0aW9ucyBhcmUgY29tcGxldGUuIFRoZSBjb21wbGV0ZWQgaW5zcGVjdGlvbnMgcmFuZ2UgaW4gdGltZSBmcm9tIGByIG1pbihkZl8zMjQkZGF0ZSwgbmEucm0gPSBUUlVFKWAgdG8gYHIgbWF4KGRmXzMyNCRkYXRlLCBuYS5ybSA9IFRSVUUpYC4gU3R1ZGVudHMgYXJlIG5vdyB3b3JraW5nIG9uIG9sZGVyIFNJUyBmb3JtcyB3aGljaCBhcmUgc3RydWN0dXJlZCBkaWZmZXJlbnRseS4gVGhlIHByZWxpbWluYXJ5IEVEQSBiZWxvdyBpcyByZXN0cmljdGVkIHRvIHRoZSBtb3JlIGN1cnJlbnQgU0lTIGZvcm1zIHdoaWNoIHdlcmUgZmlyc3QgdXNlZCBpbiBNYXkgMjAxOS4NCg0KIyMgU3VtbWFyeSBUYWJsZXMNCg0KU3VtbWFyeSB0YWJsZXMgaGVscCB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGhvdyBtYW55IGluc3RhbmNlcyBvY2N1ciB3aXRoaW4gcGFydGljdWxhciBjYXRlZ29yeSBvZiBkYXRhIG9yIGhvdyBmcmVxdWVudCBhIHBhcnRpY3VsYXIgaXNzdWUgaXMgcmVjb3JkZWQgYXQgYSBnaXZlbiBmYWNpbGl0eS4gU3VtbWFyeSB0YWJsZXMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIGBncm91cF9ieWAgd2l0aCBgc3VtbWFyaXplYCB3aXRoIHRoZSByZXN1bHRzIHBpcGVkIHRvIGBrYWJsZWAgYW5kIGBrYWJsZUV4dHJhYC4gVGhpcyBwcm9kdWNlcyByZXN1bHRzIHNpbWlsYXIgdG8gYSAicGl2b3QgdGFibGUiIGZyb20gRXhjZWwuDQoNClRhYmxlIFxAcmVmKHRhYjppbnNwZWN0aW9uLWNvdW50KSBzaG93cyB0aGUgbnVtYmVyIG9mIGluc3BlY3Rpb25zIHBlciBmYWNpbGl0eSB0aGF0IGFyZSBwcm9jZXNzZWQgc28gZmFyLiBUaGUgdmFsdWVzIHJhbmdlIGZyb20gMS0zIGluc3BlY3Rpb25zLiBEb3JjaGVzdGVyIENvdW50eSBEZXRlbnRpb24gQ2VudGVyLCBHb2xkZW4gU3RhdGUgQW5uZXgsIGFuZCBSaXZlciBDb3JyZWN0aW9uYWwgQ2VudGVyIGFsbCBoYXZlIHRocmVlIGluc3BlY3Rpb25zLg0KDQpgYGB7ciBpbnNwZWN0aW9uLWNvdW50fQ0KZGZfZmFjaWxpdHkgPC0gZGZfMzI0ICU+JSANCiAgZ3JvdXBfYnkoZmFjaWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKG5faW5zcGVjdGlvbnMgPSBuKCkpICU+JSANCiAgdW5ncm91cCgpIA0KICANCmRmX2ZhY2lsaXR5ICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJJbnNwZWN0aW9ucyBSZXZpZXdlZCBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIkluc3BlY3Rpb25zIFJldmlld2VkIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpICU+JSANCiAgc2Nyb2xsX2JveChoZWlnaHQgPSAiMzAwcHgiKQ0KYGBgDQoNCiMjIEZhY2V0IFBsb3RzDQoNCkZhY2V0IHBsb3RzIHBhcnRpdGlvbiBlYWNoIHBvcnRpb24gb2YgYSBwbG90IGludG8gYSBtYXRyaXggb2YgcGFuZWxzLiBUaGVzZSBwbG90cyBhcmUgcHJvZHVjZWQgZm9yIHNldmVyYWwgY2F0ZWdvcmllcyBvZiBkYXRhIHdoZXJlIGVhY2ggcGFuZWwgcmVwcmVzZW50cyBhIGZhY2lsaXR5IGZvciBhIGdpdmVuIHZhcmlhYmxlIHJlcG9ydGVkIGluIHRoZSBTSVMgZm9ybS4gV2l0aGluIGVhY2ggY2F0ZWdvcnksIGNvbHVtbnMgYXJlIHBpdm90ZWQgbG9uZ2VyIGFuZCBwbG90dGVkIGJ5IGRhdGUuIEdyYXBoaW5nIGlzIGRvbmUgdXNpbmcgdGhlIGBnZ3Bsb3QyYCBsaWJyYXJ5IFtAUi1nZ3Bsb3QyXSB3aXRoIHRoZSBgZmFjZXRfd3JhcGAgZnVuY3Rpb24gdG8gcHJvdmlkZSBhIG1lYW5zIHRvIGNvbXBhcmUgbXVsdGlwbGUgZmFjaWxpdGllcyBzaW11bHRhbmVvdXNseS4gU3VjaCBhIHBsb3QgY2FuIGhlbHAgaWRlbnRpZnkgdHJlbmRzIGFuZCBndWlkZSBtb3JlIHNwZWNpZmljIHF1ZXN0aW9ucy4NCg0KDQojIyBTSVMgRm9ybSBzdHJ1Y3R1cmUNClRoZSBJQ0UgRy0zMjRBIFNpZ25pZmljYW50IEluY2lkZW50IFN1bW1hcnkgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIGluZm9ybWF0aW9uOg0KDQoNCg0KIyBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQNCg0KIyMgQWxsZWdhdGlvbnMNCg0KIyMjIFN1bW1hcnkgVGFibGVzDQoNCmBgYHtyfQ0KZGZfc2V4X2FsbGVnIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlOg0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8yOQ0KICAgICAgICkgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlOg0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8yOQ0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlOnRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucywNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfY291bnQiKSAlPiUNCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlID0gZmFjdG9yKHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWUiLA0KICAgICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfaW5tYXRlX29uX2RldGFpbmVlIiwNCiAgICAic2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2lubWF0ZSIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlciIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8yOSIsDQogICAgInRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucyINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zZXhfYWxsZWcgJT4lIA0KICBncm91cF9ieShzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdCBBbGxlZ2F0aW9ucyBieSBUeXBlYCA9IHN1bShzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJBbGxlZ2F0aW9uIFR5cGUiLCAiVG90YWwgQWxsZWdhdGlvbiBUeXBlIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCg0KZGZfc2V4X2FsbGVnICU+JSANCiAgZ3JvdXBfYnkoZmFjaWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucyA9IHN1bShzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfY291bnQpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9zZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KIyMjIEZhY2V0IFBsb3Qgb2YgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IEZhY2lsaXR5DQoNCmBgYHtyIHNleHVhbC1hYnVzZS1hbGxlZ2F0aW9uLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgImRvdHRlZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoNiwgIlBhaXJlZCIpDQpwbG90X2NvbG9yc1s2XSA8LSAiIzAwMDAwMCINCg0KIyBDcmVhdGUgcGxvdCBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIERldGFpbmVlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gSW5tYXRlIG9uIERldGFpbmVlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gSW5tYXRlIiwNCiAgICAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIgb24gRGV0YWluZWUiLA0KICAgICJOdW1iZXIgb2YgU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIC0gRGV0YWluZWUgb24gU3RhZmYvQ29udHJhY3Rvci9Wb2x1bnRlZXIiLA0KICAgICJUb3RhbCBTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMiKQ0KDQpkZl9zZXhfYWxsZWcgJT4lIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfY291bnQsIGxpbmV0eXBlPXNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc190eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNikNCiAgICApKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbiBUeXBlOiIpKw0KDQogIGxhYnModGl0bGUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIikrDQogIHlsYWIoIk51bWJlciBvZiBBbGxlZ2F0aW9ucyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAgICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTgpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIyBTdWJzdGFudGlhdGVkIEFsbGVnYXRpb25zDQoNCiMjIyBTdW1tYXJ5IFRhYmxlcw0KDQpgYGB7cn0NCmRmX3NleF9hbGxlZ19zdWIgPC0gZGZfMzI0X2luYyAlPiUNCiAgDQogICMgU3Vic2V0IHRoZSBkZiB0byBvbmx5IHRoZSB1c2VkIGNvbHMNCiAgc2VsZWN0KGlkLCBmYWNpbGl0eSwgZGF0ZSwNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWVfMjoNCiAgICAgICBzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fc3RhZmZfY29udHJhY3Rvcl92b2x1bnRlZXJfMzQNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zID0gc3VtKGNfYWNyb3NzKA0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9kZXRhaW5lZV8yOg0KICAgICAgIHNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8zNA0KICApKSkgJT4lIA0KDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zX2RldGFpbmVlX29uX2RldGFpbmVlXzI6dG90YWxfc2V4dWFsX2FidXNlX2FsbGVnYXRpb25zLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAic2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfY291bnQiKSAlPiUNCiAgDQogICMgUmVtb3ZlIE5BIHZhbHVlcw0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBFeHBsaWNpdGx5IHNldCBmYWN0b3IgbGV2ZWxzDQogIG11dGF0ZShzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF90eXBlPSBmYWN0b3Ioc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfdHlwZSwgbGV2ZWxzID1jKA0KICAgICJzZXh1YWxfYWJ1c2VfYWxsZWdhdGlvbnNfZGV0YWluZWVfb25fZGV0YWluZWVfMiIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19pbm1hdGVfb25fZGV0YWluZWVfMiIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9pbm1hdGVfMiIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl9vbl9kZXRhaW5lZSIsDQogICAgInNleHVhbF9hYnVzZV9hbGxlZ2F0aW9uc19kZXRhaW5lZV9vbl9zdGFmZl9jb250cmFjdG9yX3ZvbHVudGVlcl8zNCIsDQogICAgInRvdGFsX3NleHVhbF9hYnVzZV9hbGxlZ2F0aW9ucyINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zZXhfYWxsZWdfc3ViICU+JSANCiAgZ3JvdXBfYnkoc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdCBBbGxlZ2F0aW9ucyBTdWJzdGFudGlhdGVkIGJ5IFR5cGVgID0gc3VtKHNleHVhbF9hYnVzZV9zdWJzdGFudGlhdGVkX2NvdW50KSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFN1YnN0YW50aWF0ZWQgU2V4dWFsIEFidXNlIGFuZCBBc3NhdWx0IEFsbGVnYXRpb25zIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJTdWJzdGFudGlhdGVkIEFsbGVnYXRpb24gVHlwZSIsICJUb3RhbCBTdWJzdGFudGlhdGVkIEFsbGVnYXRpb24gVHlwZSIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQ0KDQoNCmRmX3NleF9hbGxlZ19zdWIgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWQgPSBzdW0oc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfY291bnQpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9zZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTdWJzdGFudGlhdGVkIFNleHVhbCBBYnVzZSBhbmQgQXNzYXVsdCBBbGxlZ2F0aW9ucyBieSBGYWNpbGl0eSIsDQogICAgICAgIGNvbC5uYW1lcyA9IGMoIkZhY2lsaXR5IiwgIlRvdGFsIFN1YnN0YW50aWF0ZWQgQWxsZWdhdGlvbnMgYnkgRmFjaWxpdHkiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KIyMjIEZhY2V0IFBsb3Qgb2YgU3Vic3RhbnRpYXRlZCBTZXh1YWwgQWJ1c2UgYW5kIEFzc2F1bHQgQWxsZWdhdGlvbnMNCg0KYGBge3Igc2V4dWFsLWFidXNlLXN1YnN0YW50aWF0ZWQtZmFjZXQsIGZpZy5oZWlnaHQ9NDB9DQojIEdlbmVyYXRpbmcgYSBsaW5ldHlwZSB2ZWN0b3IgZm9yIHVzZSBpbiB0aGUgcGxvdA0KcGxvdF9saW5lcyA8LSBjKA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAiZG90dGVkIg0KICAgICkNCg0KIyBVc2UgQ29sb3IgQnJld2VyIHRvIHNldCBjb2xvcnMgYW5kIG1vZGlmeQ0KIyB0aGUgbGFzdCBjb2xvciB0byBiZSBibGFjayBmb3IgdG90YWxzLg0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg2LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzZdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSB0aGUgbGFiZWxzDQpwbG90X2xhYmVscyA8LSBjKA0KICAgICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbnMgLSBEZXRhaW5lZSBvbiBEZXRhaW5lZSIsDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIElubWF0ZSBvbiBEZXRhaW5lZSIsDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIERldGFpbmVlIG9uIElubWF0ZSIsDQogICAgIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIFN0YWZmL0NvbnRyYWN0b3IvVm9sdW50ZWVyIG9uIERldGFpbmVlIiwNCiAgICAiTnVtYmVyIG9mIFNleHVhbCBBYnVzZSBBbGxlZ2F0aW9ucyAtIERldGFpbmVlIG9uIFN0YWZmL0NvbnRyYWN0b3IvVm9sdW50ZWVyIiwNCiAgICAiVG90YWwgU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIikNCg0KZGZfc2V4X2FsbGVnX3N1YiAlPiUgDQogIA0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBzZXh1YWxfYWJ1c2Vfc3Vic3RhbnRpYXRlZF9jb3VudCwgbGluZXR5cGU9c2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gc2V4dWFsX2FidXNlX3N1YnN0YW50aWF0ZWRfdHlwZSksc2l6ZT0uNjUpICsNCiAgDQogICMgU2V0IHRoZSBsaW5ldHlwZQ0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoDQogICAgdmFsdWVzID0gcGxvdF9saW5lcywNCiAgICBsYWJlbHMgPSBwbG90X2xhYmVscywNCiAgICBuYW1lID0gIlNleHVhbCBBYnVzZSBBbGxlZ2F0aW9uIFR5cGU6IiwNCiAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChucm93ID0gNikNCiAgICApKw0KICANCiAgIyBTZXQgdGhlIGNvbG9yDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJTZXh1YWwgQWJ1c2UgQWxsZWdhdGlvbiBUeXBlOiIpKw0KDQogIGxhYnModGl0bGUgPSAiU2V4dWFsIEFidXNlIEFsbGVnYXRpb25zIFN1YnN0YW50aWF0ZWQiKSsNCiAgeWxhYigiTnVtYmVyIG9mIEFsbGVnYXRpb25zIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTgpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIE1lZGljYWwNCg0KIyMgTWVkaWNhbCBPYnNlcnZhdGlvbg0KDQpgYGB7ciBtZWRpY2FsLW1lbnRhbC1vYnNlcnZhdGlvbi1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJkb3R0ZWQiDQogICAgKQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycw0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCgzLCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzNdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiRGV0YWluZWVzIGluIE1lZGljYWwgT2JzZXJ2YXRpb24iLA0KICAgICJEZXRhaW5lZXMgaW4gTWVudGFsIEhlYWx0aCBPYnNlcnZhdGlvbiIsDQogICAgIlRvdGFsIEluZGl2aWR1YWxzIGluIE1lZGljYWwgb3IgTWVudGFsIEhlYWx0aCBPYnNlcnZhdGlvbiIpDQoNCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb246DQogICAgICAgZGV0YWluZWVzX2luX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24NCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgQ3JlYXRlIGEgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfbWVudGFsX21lZGljYWxfb2JzZXJ2YXRpb24gPSBzdW0oY19hY3Jvc3MoDQogICAgICAgZGV0YWluZWVzX2luX21lZGljYWxfb2JzZXJ2YXRpb246DQogICAgICAgZGV0YWluZWVzX2luX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24NCiAgKSkpICU+JSANCg0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIGRldGFpbmVlc19pbl9tZWRpY2FsX29ic2VydmF0aW9uOnRvdGFsX21lbnRhbF9tZWRpY2FsX29ic2VydmF0aW9uLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAibWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWVkaWNhbF9tZW50YWxfb2JzZXJ2YXRpb25fY291bnQiKSAlPiUNCiAgDQogICMgUmVtb3ZlIE5BIHZhbHVlcw0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBFeHBsaWNpdGx5IHNldCBmYWN0b3IgbGV2ZWxzDQogIG11dGF0ZShtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl90eXBlID0gZmFjdG9yKG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX3R5cGUsIGxldmVscyA9IGMoDQogICAgImRldGFpbmVlc19pbl9tZWRpY2FsX29ic2VydmF0aW9uIiwNCiAgICAiZGV0YWluZWVzX2luX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24iLA0KICAgICJ0b3RhbF9tZW50YWxfbWVkaWNhbF9vYnNlcnZhdGlvbiINCiAgKSkpICU+JSANCiAgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IG1lZGljYWxfbWVudGFsX29ic2VydmF0aW9uX2NvdW50LCBsaW5ldHlwZT1tZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl90eXBlKSkrDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBtZWRpY2FsX21lbnRhbF9vYnNlcnZhdGlvbl90eXBlKSxzaXplPS42NSkgKw0KICANCiAgIyBTZXQgdGhlIGxpbmV0eXBlDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBwbG90X2xpbmVzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiT2JzZXJ2YXRpb24gVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAzKQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk9ic2VydmF0aW9uIFR5cGU6IiwpKw0KDQogIGxhYnModGl0bGUgPSAiTWVkaWNhbCBhbmQgTWVudGFsIEhlYWx0aCBPYnNlcnZhdGlvbiIpKw0KICB5bGFiKCJOdW1iZXIgb2YgSW5kaXZpZHVhbHMgaW4gT2JzZXJ2YXRpb24iKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9MykpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KICANCmBgYA0KDQojIyBJbmZlY3Rpb25zIERpc2Vhc2UNCg0KYGBge3IgaW5mZWN0aW91cy1kaXNlYXNlLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCINCiAgICApDQoNCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDIsICJQYWlyZWQiKQ0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiSW5mZWN0aW91cyBEaXNlYXNlIFJlcG9ydGVkIiwNCiAgICAiSW5mZWN0aW91cyBEaXNlYXNlIENvbmZpcm1lZCIpDQoNCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgaW5mZWN0aW91c19kaXNlYXNlX3JlcG9ydGVkOg0KICAgICAgIGluZmVjdGlvbnNfZGlzZWFzZV9jb25maXJtZWQNCiAgICAgICApICU+JSANCiAgDQogICMgTmVlZCB0aGUgcm93d2lzZSBmdW5jdGlvbiB0byBjb21wdXRlIGEgcm93LWF0LWEtdGltZQ0KICAjIGluIHRoZSBmb2xsb3dpbmcgbXV0YXRlIGZ1bmN0aW9uDQogIHJvd3dpc2UoaWQpICU+JSANCiAgDQogICMgIyBDcmVhdGUgYSBuZXcgdG90YWwgY29sdW1uDQogICMgIyBJbiB0aGlzIGNhc2Ugbm90IHVzZWQNCiAgIyBtdXRhdGUodG90YWxfaW5mZWN0aW9uc19kaXNlYXNlX3JlcG9ydF9jb25maXJtZWQgPSBzdW0oY19hY3Jvc3MoDQogICMgICAgICBpbmZlY3Rpb3VzX2Rpc2Vhc2VfcmVwb3J0ZWQ6DQogICMgICAgICBpbmZlY3Rpb25zX2Rpc2Vhc2VfY29uZmlybWVkDQogICMgKSkpICU+JSANCg0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIGluZmVjdGlvdXNfZGlzZWFzZV9yZXBvcnRlZDppbmZlY3Rpb25zX2Rpc2Vhc2VfY29uZmlybWVkLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiaW5mZWN0aW91c19kaXNlYXNlX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImluZmVjdGlvdXNfZGlzZWFzZV9jb3VudCIpICU+JQ0KICANCiAgIyBSZW1vdmUgTkEgdmFsdWVzDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgZGVmaW5lIGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKGluZmVjdGlvdXNfZGlzZWFzZV90eXBlID0gZmFjdG9yKGluZmVjdGlvdXNfZGlzZWFzZV90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJpbmZlY3Rpb3VzX2Rpc2Vhc2VfcmVwb3J0ZWQiLA0KICAgICJpbmZlY3Rpb25zX2Rpc2Vhc2VfY29uZmlybWVkIg0KICApKSkgJT4lIA0KICANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gaW5mZWN0aW91c19kaXNlYXNlX2NvdW50LCBsaW5ldHlwZT1pbmZlY3Rpb3VzX2Rpc2Vhc2VfdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gaW5mZWN0aW91c19kaXNlYXNlX3R5cGUpLHNpemU9LjY1KSArDQogIA0KICAjIFNldCB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJDYXRlZ29yeToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiQ2F0ZWdvcnk6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJJbmZlY3Rpb3VzIERpc2Vhc2VzIFJlcG9ydGVkIGFuZCBDb25maXJtZWQiKSsNCiAgeWxhYigiQ291bnQiKSsNCiAgeGxhYigiRGF0ZSIpKw0KICB0aGVtZSgNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICAgICkrDQoNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9MykpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbD0zKQ0KICANCiAgDQpgYGANCg0KIyMgTWVkaWNhbCBhbmQgTWVudGFsIEhlYWx0aCBSZWZlcnJhbHMNCg0KYGBge3IgcmVmZXJyYWxzLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KIyBHZW5lcmF0aW5nIGEgbGluZXR5cGUgdmVjdG9yIGZvciB1c2UgaW4gdGhlIHBsb3QNCnBsb3RfbGluZXMgPC0gYygNCiAgICAic29saWQiLA0KICAgICJzb2xpZCIsDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJkb3R0ZWQiDQogICAgKQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycw0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCg1LCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzVdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAiT3V0c2lkZSBNZWRpY2FsIFJlZmVycmFscyIsDQogICAgIkRldGFpbmVlcyBUcmFuc3BvcnRlZCB0byBPZmYtU2l0ZSBIb3NwaXRhbHMgZm9yIEVtZXJnZW5jeSBSZWFzb25zIiwNCiAgICAiQWRtaXNzaW9ucyB0byBPZmYtU2l0ZSBIb3NwaXRhbHMgZm9yIE1lZGljYWwgUmVhc29ucyIsDQogICAgIkFkbWlzc2lvbnMgdG8gT2ZmLVNpdGUgSG9zcGl0YWxzIGZvciBNZW50YWwgSGVhbHRoIFJlYXNvbnMiLA0KICAgICJUb3RhbCBSZWZlcnJhbHMiKQ0KDQoNCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgb3V0c2lkZV9tZWRpY2FsX3JlZmVycmFsczoNCiAgICAgICBhZG1pc3Npb25zX3RvX29mZl9zaXRlX2hvc3BpdGFsc19mb3JfbWVudGFsX2hlYWx0aF9yZWFzb25zDQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3JlZmVycmFscyA9IHN1bShjX2Fjcm9zcygNCiAgICAgICBvdXRzaWRlX21lZGljYWxfcmVmZXJyYWxzOg0KICAgICAgIGFkbWlzc2lvbnNfdG9fb2ZmX3NpdGVfaG9zcGl0YWxzX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMNCiAgKSkpICU+JSANCg0KICAjIENhbGwgYSByYW5nZSBvZiB0YWJsZSBjb2x1bW5zIGFuZCBwaXZvdCBsb25nDQogIHBpdm90X2xvbmdlciguLA0KICAgICAgICAgICAgICAgY29scz0gIG91dHNpZGVfbWVkaWNhbF9yZWZlcnJhbHM6dG90YWxfcmVmZXJyYWxzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAicmVmZXJyYWxfdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVmZXJyYWxfY291bnQiKSAlPiUNCiAgDQogICMgUmVtb3ZlIE5BIHZhbHVlcw0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBFeHBsaWNpdGx5IGRlZmluZSBmYWN0b3IgbGV2ZWxzDQogIG11dGF0ZShyZWZlcnJhbF90eXBlPSBmYWN0b3IocmVmZXJyYWxfdHlwZSwgbGV2ZWxzID0gYygNCiAgICAib3V0c2lkZV9tZWRpY2FsX3JlZmVycmFscyIsDQogICAgImRldGFpbmVlc190cmFuc3BvcnRlZF90b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX2VtZXJnZW5jeV9jYXJlIiwNCiAgICAiYWRtaXNzaW9uc190b19vZmZfc2l0ZV9ob3NwaXRhbHNfZm9yX21lZGljYWxfcmVhc29ucyIsDQogICAgImFkbWlzc2lvbnNfdG9fb2ZmX3NpdGVfaG9zcGl0YWxzX2Zvcl9tZW50YWxfaGVhbHRoX3JlYXNvbnMiLA0KICAgICJ0b3RhbF9yZWZlcnJhbHMiDQogICkpKSAlPiUgDQogIA0KICANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gcmVmZXJyYWxfY291bnQsIGxpbmV0eXBlPXJlZmVycmFsX3R5cGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHJlZmVycmFsX3R5cGUpLHNpemU9LjY1KSArDQogIA0KICAjIFNldCB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJSZWZlcnJhbCBUeXBlOiIsDQogICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDUpDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBjb2xvcg0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGxvdF9jb2xvcnMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJSZWZlcnJhbCBUeXBlOiIpKw0KDQogIGxhYnModGl0bGUgPSAiTWVkaWNhbCBhbmQgTWVudGFsIEhlYWx0aCBSZWZlcnJhbHMiKSsNCiAgeWxhYigiTnVtYmVyIG9mIFJlZmVycmFscyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCg0KICAjIFNldCB0aGUgbGVnZW5kIHRvIG11bHRpcGxlIHJvd3MNCiAgZ3VpZGVzKGNvbCA9IGd1aWRlX2xlZ2VuZChucm93ID01KSkrDQogIA0KICAjIFdyYXANCiAgZmFjZXRfd3JhcCh+IGZhY2lsaXR5LCBuY29sPTMpDQpgYGANCg0KIyMgU2ljayBDYWxsIFJlcXVlc3RzIGFuZCBFbmNvdW50ZXJzDQoNCmBgYHtyfQ0KZGZfc2lja19jYWxsIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFNlbGVjdCBhIHN1YnNldCBvZiBjb2x1bW5zIHRvIHdvcmsgd2l0aA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBzaWNrX2NhbGxfcmVxdWVzdHMsDQogICAgICAgICBzaWNrX2NhbGxfZW5jb3VudGVycykgJT4lIA0KICANCiAgIyBOZWVkIHRoZSByb3d3aXNlIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYSByb3ctYXQtYS10aW1lDQogICMgaW4gdGhlIGZvbGxvd2luZyBtdXRhdGUgZnVuY3Rpb24NCiAgcm93d2lzZShpZCkgJT4lIA0KICANCiAgIyBDcmVhdGUgbmV3IHRvdGFsIGNvbHVtbg0KICBtdXRhdGUodG90YWxfc2lja19jYWxsID0gc2lja19jYWxsX3JlcXVlc3RzLA0KICAgICAgICAgc2lja19jYWxsX2VuY291bnRlcnMpICU+JSANCiAgDQogICMgVGlkeQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9IHNpY2tfY2FsbF9yZXF1ZXN0czoNCiAgICAgICAgIHNpY2tfY2FsbF9lbmNvdW50ZXJzLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2lja19jYWxsX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInNpY2tfY2FsbF9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNpY2tfY2FsbF90eXBlID0gZmFjdG9yKHNpY2tfY2FsbF90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzaWNrX2NhbGxfcmVxdWVzdHMiLA0KICAgICJzaWNrX2NhbGxfZW5jb3VudGVycyIsDQogICAgInRvdGFsX3NpY2tfY2FsbCINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zaWNrX2NhbGwgJT4lIA0KICBncm91cF9ieShzaWNrX2NhbGxfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYFRvdGFsIFNpY2sgQ2FsbCBieSBUeXBlYCA9IHN1bShzaWNrX2NhbGxfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU2ljayBDYWxsIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJUeXBlIiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCmRmX3NpY2tfY2FsbCAlPiUgDQogIGdyb3VwX2J5KGZhY2lsaXR5KSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9zaWNrX2NhbGwgPSBzdW0oc2lja19jYWxsX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc2lja19jYWxsKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFNpY2sgQ2FsbCBSZXF1ZXN0cy9FbmNvdW50ZXJzIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KYGBge3Igc2ljay1jYWxscywgZmlnLmhlaWdodD00MH0NCiMgR2VuZXJhdGluZyBhIGxpbmV0eXBlIHZlY3RvciBmb3IgdXNlIGluIHRoZSBwbG90DQpwbG90X2xpbmVzIDwtIGMoDQogICAgInNvbGlkIiwNCiAgICAic29saWQiLA0KICAgICJkb3R0ZWQiDQogICAgKQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycw0KcGxvdF9jb2xvcnMgPC0gYnJld2VyLnBhbCgzLCAiUGFpcmVkIikNCnBsb3RfY29sb3JzWzNdIDwtICIjMDAwMDAwIg0KDQojIENyZWF0ZSBsYWJlbHMNCnBsb3RfbGFiZWxzIDwtIGMoDQogICAgIlNpY2sgQ2FsbCBSZXF1ZXN0cyIsDQogICAgIlNpY2sgQ2FsbCBFbmNvdW50ZXJzIiwNCiAgICAiVG90YWwgU2ljayBDYWxscyIpDQoNCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgc2lja19jYWxsX3JlcXVlc3RzOg0KICAgICAgIHNpY2tfY2FsbF9lbmNvdW50ZXJzDQogICAgICAgKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBhIG5ldyB0b3RhbCBjb2x1bW4NCiAgbXV0YXRlKHRvdGFsX3NpY2tfY2FsbHMgPSBzdW0oY19hY3Jvc3MoDQogICAgICAgc2lja19jYWxsX3JlcXVlc3RzOg0KICAgICAgIHNpY2tfY2FsbF9lbmNvdW50ZXJzDQogICkpKSAlPiUgDQoNCiAgIyBDYWxsIGEgcmFuZ2Ugb2YgdGFibGUgY29sdW1ucyBhbmQgcGl2b3QgbG9uZw0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9ICBzaWNrX2NhbGxfcmVxdWVzdHM6dG90YWxfc2lja19jYWxscywNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNpY2tfY2FsbF90eXBlIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzaWNrX2NhbGxfY291bnQiKSAlPiUNCiAgDQogICMgUmVtb3ZlIE5BIHZhbHVlcw0KICBkcm9wX25hKCkgJT4lIA0KICANCiAgIyBFeHBsaWNpdGx5IGRlZmluZSBmYWN0b3IgbGV2ZWxzDQogIG11dGF0ZShzaWNrX2NhbGxfdHlwZSA9IGZhY3RvcihzaWNrX2NhbGxfdHlwZSwgbGV2ZWxzID0gYygNCiAgICAic2lja19jYWxsX3JlcXVlc3RzIiwNCiAgICAic2lja19jYWxsX2VuY291bnRlcnMiLA0KICAgICJ0b3RhbF9zaWNrX2NhbGxzIg0KICApKSkgJT4lIA0KICANCiAgIyBDYWxsaW5nIHRoZSBwbG90IGFuZCBmb3JtYXR0aW5nDQogIGdncGxvdChhZXMoeD1kYXRlLCB5ID0gc2lja19jYWxsX2NvdW50LCBsaW5ldHlwZT1zaWNrX2NhbGxfdHlwZSkpKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gc2lja19jYWxsX3R5cGUpLHNpemU9LjY1KSArDQogIA0KICAjIFNldCB0aGUgbGluZXR5cGUNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfbGluZXMsDQogICAgbGFiZWxzID0gcGxvdF9sYWJlbHMsDQogICAgbmFtZSA9ICJTaWNrIENhbGwgVHlwZToiLA0KICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAzKQ0KICAgICkrDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiU2ljayBDYWxsIFR5cGU6IikrDQoNCiAgbGFicyh0aXRsZSA9ICJTaWNrIENhbGxzIikrDQogIHlsYWIoIk51bWJlciBvZiBTaWNrIENhbGxzIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgdGhlbWUoDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSINCiAgICApKw0KDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTMpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2w9MykNCmBgYA0KDQojIyBTdWljaWRlIEF0dGVtcHRzIGFuZCBXYXRjaGVzDQoNClRoZSBmb2xsb3dpbmcgc2hvd3MgU3VpY2lkZSBBdHRlbXB0cyBhbmQgU3VpY2lkZSBXYXRjaGVzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgYXMgb2YgYHIgU3lzLkRhdGUoKWAuIFRoZSBudW1iZXJzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4NCg0KYGBge3J9DQpkZl9zdWljaWRlIDwtIGRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFNlbGVjdCBhIHN1YnNldCBvZiBjb2x1bW5zIHRvIHdvcmsgd2l0aA0KICBzZWxlY3QoaWQsDQogICAgICAgICBmYWNpbGl0eSwNCiAgICAgICAgIGRhdGUsDQogICAgICAgICBzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSwNCiAgICAgICAgIHN1aWNpZGVfd2F0Y2hlc19jb25zdGFudF93YXRjaF9tZW50YWxfaGVhbHRoX29ic2VydmF0aW9uKSAlPiUgDQogIA0KICAjIE5lZWQgdGhlIHJvd3dpc2UgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIHJvdy1hdC1hLXRpbWUNCiAgIyBpbiB0aGUgZm9sbG93aW5nIG11dGF0ZSBmdW5jdGlvbg0KICByb3d3aXNlKGlkKSAlPiUgDQogIA0KICAjIENyZWF0ZSBuZXcgdG90YWwgY29sdW1uDQogIG11dGF0ZSh0b3RhbF9zdWljaWRlID0gc3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm0gKw0KICAgICAgICAgc3VpY2lkZV93YXRjaGVzX2NvbnN0YW50X3dhdGNoX21lbnRhbF9oZWFsdGhfb2JzZXJ2YXRpb24pICU+JSANCiAgDQogICMgVGlkeQ0KICBwaXZvdF9sb25nZXIoLiwNCiAgICAgICAgICAgICAgIGNvbHM9IHN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtOg0KICAgICAgICAgICAgICAgdG90YWxfc3VpY2lkZSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInN1aWNpZGVfdHlwZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAic3VpY2lkZV9jb3VudCIpICU+JSANCiAgDQogICMgUmVtb3ZlIE5BDQogIGRyb3BfbmEoKSAlPiUgDQogIA0KICAjIEV4cGxpY2l0bHkgc2V0IGZhY3RvciBsZXZlbHMNCiAgbXV0YXRlKHNlZ3JlZ2F0aW9uX3R5cGUgPSBmYWN0b3Ioc3VpY2lkZV90eXBlLCBsZXZlbHMgPSBjKA0KICAgICJzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSIsDQogICAgInN1aWNpZGVfd2F0Y2hlc19jb25zdGFudF93YXRjaF9tZW50YWxfaGVhbHRoX29ic2VydmF0aW9uIiwNCiAgICAidG90YWxfc3VpY2lkZSINCiAgKSkpDQpgYGANCg0KYGBge3J9DQpkZl9zdWljaWRlICU+JSANCiAgZ3JvdXBfYnkoc3VpY2lkZV90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShgVG90YWwgU3VpY2lkZSBBdHRlbXB0IG9yIFdhdGNoIGJ5IFR5cGVgID0gc3VtKHN1aWNpZGVfY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG90YWwgU3VpY2lkZSBBdHRlbXB0IG9yIFdhdGNoIGJ5IFR5cGUiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJUeXBlIiwgIlRvdGFsIikpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJob3ZlciIsICJzdHJpcGVkIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpDQoNCmRmX3N1aWNpZGUgJT4lIA0KICBncm91cF9ieShmYWNpbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfc3VpY2lkZSA9IHN1bShzdWljaWRlX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfc3VpY2lkZSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3RhbCBTdWljaWRlIEF0dGVtcHQgb3IgV2F0Y2ggYnkgRmFjaWxpdHkiLA0KICAgICAgICBjb2wubmFtZXMgPSBjKCJGYWNpbGl0eSIsICJUb3RhbCIpKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygiaG92ZXIiLCAic3RyaXBlZCIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSAlPiUgDQogIHNjcm9sbF9ib3goaGVpZ2h0ID0gIjMwMHB4IikNCmBgYA0KDQpgYGB7ciBzdWljaWRlLWZhY2V0LCBmaWcuaGVpZ2h0PTQwfQ0KDQojIFVzZSBDb2xvciBCcmV3ZXIgdG8gc2V0IGNvbG9ycyBhbmQgbW9kaWZ5DQojIHRoZSBsYXN0IGNvbG9yIHRvIGJlIGJsYWNrIGZvciB0b3RhbHMuDQpwbG90X2NvbG9ycyA8LSBicmV3ZXIucGFsKDIsICJQYWlyZWQiKQ0KDQojIENyZWF0ZSBwbG90IGxhYmVscw0KcGxvdF9sYWJlbHMgPC0gYygNCiAgICAgICJTdWljaWRlIEF0dGVtcHRzIG9yIFNlbGYgSGFybSIsDQogICAgICAiU3VpY2lkZSBXYXRjaGVzL0NvbnN0YW50IFdhdGNoL01lbnRhbCBIZWFsdGggT2JzZXJ2YXRpb24iKQ0KDQpkZl8zMjRfaW5jICU+JQ0KICANCiAgIyBTdWJzZXQgdGhlIGRmIHRvIG9ubHkgdGhlIHVzZWQgY29scw0KICBzZWxlY3QoaWQsIGZhY2lsaXR5LCBkYXRlLA0KICAgICAgIHN1aWNpZGVfYXR0ZW1wdHNfb3Jfc2VsZl9oYXJtLA0KICAgICAgIHN1aWNpZGVfd2F0Y2hlc19jb25zdGFudF93YXRjaF9tZW50YWxfaGVhbHRoX29ic2VydmF0aW9uDQogICAgICAgKSAlPiUgDQogIGRyb3BfbmEoKSAlPiUgDQogDQogICMgQ2FsbCBhIHJhbmdlIG9mIHRhYmxlIGNvbHVtbnMgYW5kIHBpdm90IGxvbmcNCiAgcGl2b3RfbG9uZ2VyKC4sDQogICAgICAgICAgICAgICBjb2xzPSAgYyhzdWljaWRlX2F0dGVtcHRzX29yX3NlbGZfaGFybSwNCiAgICAgICBzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbiksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzdWljaWRlX3R5cGUiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInN1aWNpZGVfY291bnQiKSAlPiUgDQogIA0KICAjIFJlbW92ZSBOQSB2YWx1ZXMNCiAgZHJvcF9uYSgpICU+JSANCiAgDQogICMgRXhwbGljaXRseSBkZWZpbmUgZmFjdG9yIGxldmVscw0KICBtdXRhdGUoc3VpY2lkZV90eXBlID0gZmFjdG9yKHN1aWNpZGVfdHlwZSwgbGV2ZWxzID0gYygNCiAgICAic3VpY2lkZV9hdHRlbXB0c19vcl9zZWxmX2hhcm0iLA0KICAgICJzdWljaWRlX3dhdGNoZXNfY29uc3RhbnRfd2F0Y2hfbWVudGFsX2hlYWx0aF9vYnNlcnZhdGlvbiINCiAgKSkpICU+JSANCiAgDQogICMgQ2FsbGluZyB0aGUgcGxvdCBhbmQgZm9ybWF0dGluZw0KICBnZ3Bsb3QoYWVzKHg9ZGF0ZSwgeSA9IHN1aWNpZGVfY291bnQpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1zdWljaWRlX3R5cGUpLCBzaXplID0gLjY1KSArDQogIA0KICAjIFNldCB0aGUgY29sb3INCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgIHZhbHVlcyA9IHBsb3RfY29sb3JzLA0KICAgIGxhYmVscyA9IHBsb3RfbGFiZWxzLA0KICAgIG5hbWUgPSAiVHlwZToiDQogICAgKSsNCiAgDQogIGxhYnModGl0bGUgPSAiU3VpY2lkZSBBdHRlbXB0cyBhbmQgV2F0Y2hlcyIpKw0KICB5bGFiKCJOdW1iZXIgb2YgQXR0ZW1wdHMgb3IgV2F0Y2hlcyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCiAgIyBTZXQgdGhlIGxlZ2VuZCB0byBtdWx0aXBsZSByb3dzDQogIGd1aWRlcyhjb2wgPSBndWlkZV9sZWdlbmQobnJvdyA9NSkpKw0KICANCiAgIyBXcmFwDQogIGZhY2V0X3dyYXAofiBmYWNpbGl0eSwgbmNvbCA9IDMpDQoNCg0KYGBgDQoNCiMjIEh1bmdlciBTdHJpa2VzDQoNCmBgYHtyIGh1bmdlci1zdHJpa2Utc3VtbWFyeX0NCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsIGh1bmdlcl9zdHJpa2VzKSAlPiUgDQoNCiAgZ3JvdXBfYnkoZmFjaWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX2h1bmdlcl9zdHJpa2UgPSBzdW0oaHVuZ2VyX3N0cmlrZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9odW5nZXJfc3RyaWtlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIEh1bmdlciBTdHJpa2VzIGJ5IEZhY2lsaXR5IiwNCiAgICAgICAgY29sLm5hbWVzID0gYygiRmFjaWxpdHkiLCAiVG90YWwgSHVuZ2VyIFN0cmlrZXMiKSkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoImhvdmVyIiwgInN0cmlwZWQiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBzY3JvbGxfYm94KGhlaWdodCA9ICIzMDBweCIpDQpgYGANCg0KYGBge3IgaHVuZ2VyLXN0cmlrZS1mYWNldCwgZmlnLmhlaWdodD00MH0NCiMgVXNlIENvbG9yIEJyZXdlciB0byBzZXQgY29sb3JzIGFuZCBtb2RpZnkNCiMgdGhlIGxhc3QgY29sb3IgdG8gYmUgYmxhY2sgZm9yIHRvdGFscy4NCnBsb3RfY29sb3JzIDwtIGJyZXdlci5wYWwoMiwgIlBhaXJlZCIpDQoNCmRmXzMyNF9pbmMgJT4lDQogIA0KICAjIFN1YnNldCB0aGUgZGYgdG8gb25seSB0aGUgdXNlZCBjb2xzDQogIHNlbGVjdChpZCwgZmFjaWxpdHksIGRhdGUsDQogICAgICAgaHVuZ2VyX3N0cmlrZXMNCiAgICAgICApICU+JSANCiAgZHJvcF9uYSgpICU+JSANCiANCg0KICAjIENhbGxpbmcgdGhlIHBsb3QgYW5kIGZvcm1hdHRpbmcNCiAgZ2dwbG90KGFlcyh4PWRhdGUsIHkgPSBodW5nZXJfc3RyaWtlcykpKw0KICBnZW9tX2xpbmUoc2l6ZSA9IC42NSkgKw0KICANCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwoDQogICMgICB2YWx1ZXMgPSBwbG90X2NvbG9ycywNCiAgIyAgIGxhYmVscyA9IGMoDQogICMgICAgICJTdWljaWRlIEF0dGVtcHRzIG9yIFNlbGYgSGFybSIsDQogICMgICAgICJTdWljaWRlIFdhdGNoZXMvQ29uc3RhbnQgV2F0Y2gvTWVudGFsIEhlYWx0aCBPYnNlcnZhdGlvbiINCiAgIyAgICAgKSwNCiAgIyAgIG5hbWUgPSAiVHlwZToiDQogICMgICApKw0KICAjIA0KICBsYWJzKHRpdGxlID0gIkh1bmdlciBTdHJpa2VzIikrDQogIHlsYWIoIk51bWJlciBvZiBIdW5nZXIgU3RyaWtlcyIpKw0KICB4bGFiKCJEYXRlIikrDQogIHRoZW1lKA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICAgKSsNCiAgDQogICMgU2V0IHRoZSBsZWdlbmQgdG8gbXVsdGlwbGUgcm93cw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKG5yb3cgPTUpKSsNCiAgDQogICMgV3JhcA0KICBmYWNldF93cmFwKH4gZmFjaWxpdHksIG5jb2wgPSAzKQ0KYGBgDQoNCiMgQ2F1c2Ugb2YgRGVhdGgNCg0KIyMgU3VpY2lkZSBhcyBDYXVzZSBvZiBEZWF0aA0KDQpCYXIgcGxvdCBvZiBJQ0UgYW5kIG5vbi1JQ0UgZGVhdGhzIGJ5IHN1aWNpZGUgcGxvdHRlZCBieSBmYWNpbGl0eSBhcyBvZiBgciBTeXMuRGF0ZSgpYC4NCg0KYGBge3Igc3VpY2lkZS1jb2QtcGxvdH0NCmRmXzMyNCAlPiUgDQogIHNlbGVjdChpZCwNCiAgICAgICAgIGZhY2lsaXR5LA0KICAgICAgICAgc3RhdGUsDQogICAgICAgICBkYXRlLA0KICAgICAgICAgZmFjX29wZXJhdG9yLA0KICAgICAgICAgY29kX3N1aWNpZGVfaWNlLA0KICAgICAgICAgY29kX3N1aWNpZGVfbm90X2ljZSkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KICBmaWx0ZXIoY29kX3N1aWNpZGVfaWNlPjB8Y29kX3N1aWNpZGVfbm90X2ljZSA+MCkgJT4lIA0KICBtdXRhdGUoY29kX3N1aWNpZGVfdG90YWwgPSBjb2Rfc3VpY2lkZV9pY2UgKyBjb2Rfc3VpY2lkZV9ub3RfaWNlKSAlPiUgDQogIA0KICAjIEhlcmUgb25lIGNvdWxkIGNhbGwgZGF0YXRhYmxlKCkgb3Iga2FibGUoKQ0KICAjIHRvIGdldCBhIGxpc3Qgb2YgdGhlIGZhY2lsaXRpZXMgYW5kIGNvdW50DQogIA0KICAjIEluaXRpYXRlIHRoZSBwbG90DQogIGdncGxvdChhZXMoeD1jb2Rfc3VpY2lkZV90b3RhbCwgeT1mYWNpbGl0eSkpKw0KICBnZW9tX2JveHBsb3QoKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMSwyKSkrDQogIGxhYnModGl0bGUgPSAiQ2F1c2Ugb2YgRGVhdGggU3VpY2lkZSIsDQogICAgICAgc3VidGl0bGUgPSAiSW5jbHVkZXMgSUNFIGFuZCBub24tSUNFIERlYXRocyBieSBTdWljaWRlIikrDQogIHhsYWIoIkNPRCBTdWljaWRlIFRvdGFsIikrDQogIHlsYWIoIkZhY2lsaXR5IikNCmBgYA0KDQojIE9ic2VydmF0aW9ucw0KDQpPYnNlcnZhdGlvbnMgbWFkZSBvbiB0aGUgZGF0YSBhcyB0aGV5IGFjY3VtdWxhdGUgYXJlIGxvZ2dlZCBiZWxvdy4NCg0KIyMgMjggTWF5IDIwMjENCg0KMS4gIEFkZWxhbnRvIElDRSBQcm9jZXNzaW5nIENlbnRlciAtIEVhc3QgYW5kIFdlc3QgaGF2ZSBpZGVudGljYWwgZGF0YSBmb3IgMjAyMCwgYnV0IHRoZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgZm9yIDIwMTkgd2l0aCBFYXN0IGJlaW5nIG11Y2ggbG93ZXIgdGhhbiB3ZXN0LiBDcmFpZyBjaGVja2VkIHRoZSBpbnNwZWN0aW9ucyBhbmQgdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBmb3IgRWFzdCBhbmQgV2VzdCBpbiAyMDE5IHdoaWxlIHRoZXkgYXJlIGluIGZhY3QgdGhlIHNhbWUgZm9yIDIwMjAuIE5vdGUgdGhhdCAyMDIwIGlzIGEgcmVtb3RlIGluc3BlY3Rpb24uIEhvd2V2ZXIsIGl0IGlzIHNpZ25pZmljYW50IHRoYXQgdGhlIHR3byBhcmUgY29tcGFyYWJsZSBpbiBvbmUgaW5zdGFuY2UgYW5kIG5vdCBjb21wYXJhYmxlIGluIGFub3RoZXIgY2FzZS4NCg0KMi4gIEFsbWFuY2UgQ291bnR5IEphaWwgYW5kIENoYXNlIENvdW50eSBEZXRlbnRpb24gQ2VudGVyIGJvdGggc2VlbSB0byByZWdpc3RlciBibGFuayBmb3Igc29saXRhcnkuIENyYWlnIHN1c3BlY3RzIHRoaXMgaXMgYmVjYXVzZSB0aGVyZSB3ZXJlIG5vdCBjYXNlcyBvZiBzb2xpdGFyeSByZXBvcnRlZC4NCg0KIyMgMjcgTWF5IDIwMjENCg0KT25lIG9mIHRoZSBpbXBvcnRhbnQgZWFybHkgb2JzZXJ2YXRpb25zIGhhcyB0byBkbyB3aXRoIHRoZSBuYW1pbmcgb2YgZmFjaWxpdGllcy4gSUNFIGlzIG9mdGVuIGluY29uc2lzdGVudCB3aXRoIGZhY2lsaXR5IG5hbWluZyBhbmQgdGhlIG5hbWVzIGRvIG9mdGVuIGNoYW5nZSBvdmVyIHRpbWUuIEJvdGggdGhlIGNoYW5naW5nIG9mIG5hbWVzIGFuZCBpbmNvbnNpc3RlbnQgbmFtaW5nIGNvbnZlbnRpb25zIGNhbiBjYXVzZSBjb25mdXNpb24gYXMgd2VsbCBhcyBlcnJvciB3aGVuIHRhYnVsYXRpbmcgcmVzdWx0cy4NCg0KMS4gIFRoZSBncmFwaHMgZm9yICIqKkFkZWxhbnRvIElDRSBQcm9jZXNzaW5nIENlbnRlciAtIEVhc3QqKiIgYW5kICIqKkFkZWxhbnRvIElDRSBQcm9jZXNzaW5nIENlbnRlciAtIFdlc3QqKiIgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggaW5mb3JtYXRpb24gQ3JhaWcgcmVjYWxscyBzZWVpbmcgaW4gb25lIG9mIHRoZSBpbnNwZWN0aW9ucywgdGhhdCB0aGUgbnVtYmVycyBmb3IgdGhlIGZhY2lsaXRpZXMgYXJlICJtZXJnZWQiIG9yIGNvbWJpbmVkLg0KDQogICAgLSAgIEZvciBmYWNldCBncmFwaGluZyBjb25zaWRlciBmaWx0ZXJpbmcuIEZvciBhbmFseXNpcyBwdXJwb3NlcyBtYXkgbmVlZCB0byB0cmVhdCB0aGUgdHdvIGZhY2lsaXRpZXMgYXMgIm1lcmdlZCINCg0KMi4gICIqKkFkZWxhbnRvIElDRSBQcm9jZXNzaW5nIENlbnRlciBXZXN0KioiIHNob3VsZCBiZSBjb21iaW5lZCB3aXRoICIqKkFkZWxhbnRvIElDRSBQcm9jZXNzaW5nIENlbnRlciAtIFdlc3QqKiIuIEl0IGFwcGVhcnMgdGhhdCBJQ0UgaXMgbm90IGNvbnNpc3RlbnRseSBuYW1pbmcgdGhlIGZhY2lsaXRpZXMsIGluIG9uZSBjYXNlIHRoZSBuYW1lIGxhY2tzIGEgZGFzaCBjaGFyYWN0ZXIgd2hpY2ggY2F1c2VzIHRoZW0gdG8gYmUgZ3JhcGhlZCBzZXBhcmF0ZWx5Lg0KDQogICAgLSAgIFRoZSBkYXNoIHdhcyBhZGRlZCB0byBBZGVsYW50byBXZXN0Lg0KDQozLiAgSXQgd291bGQgYmUgZ29vZCB0byBjaGVjayBpZiB0aGVyZSByZWFsbHkgdHdvIGZhY2lsaXRpZXMgaW4gQWxtYW5jZSBDb3VudHkuIFRoZXJlIGFyZSBlbnRyaWVzIGxpc3RlZCBmb3IgIioqQWxtYW5jZSBDb3VudHkgRGV0ZW50aW9uIENlbnRlcioqIiBhbmQgIioqQWxtYW5jZSBDb3VudHkgSmFpbCoqIi4NCg0KICAgIC0gICBOZWVkIHRvIHZlcmlmeSB0aGF0IHRoZXNlIGFyZSBpbiBmYWN0IGRpc3RpbmN0IGZhY2lsaXRpZXMuDQoNCjQuICAiKipBdXJvcmEgSUNFIFByb2Nlc3NpbmcgQ2VudGVyIElJIC0gQW5uZXgqKiIgYW5kICIqKkF1cm9yYSBJSSBBbm5leCoqIiBzaG91bGQgcHJvYmFibHkgYmUgY29tYmluZWQuIE5lZWQgdG8gY2hlY2sgdGhlIGluc3BlY3Rpb25zIHRvIHZlcmlmeS4NCg0KICAgIC0gICAiKipBdXJvcmEgSUkgQW5uZXggKENPKSAtIEphbi4gMjksIDIwMjEiKiogd2FzIGNoYW5nZWQgdG8gIioqQXVyb3JhIElDRSBQcm9jZXNzaW5nIENlbnRlciBJSSAtIEFubmV4IChDTykgLSBKYW4uIDI5LCAyMDIxKioiDQoNCiMgUmVmZXJlbmNlcw0KDQo6OjogeyNyZWZzfQ0KOjo6DQoNCmBgYHtyIHBhY2thZ2UtcmVmZXJlbmNlcywgZWNobz1GQUxTRX0NCmtuaXRyOjp3cml0ZV9iaWIoZmlsZSA9ICdwYWNrYWdlcy5iaWInKQ0KYGBgDQo=